【问题标题】:Need user to input string /check string length (C++)需要用户输入字符串/检查字符串长度(C++)
【发布时间】:2009-04-17 10:33:18
【问题描述】:

我需要从用户那里接受一串 5 个数字(只有 5 个)。 我应该使用

istringstream 

同样的?

这样的事情我就不能逍遥法外吗?

int main()
{
    char *InputMain;
    InputMain=(char *)malloc(5+1);
    cout << "Enter the number : " <<endl;
    cin.getline ( InputMain, 5, '\n' );              // Input goes into InputMain
    cout << "The number entered is : " << InputMain <<endl;
    cin.get();
}

然后是下一部分..

我如何确保用户只输入 5 个字符?也许如果用户输入超过 5 个字符,我应该显示一个警告,说只允许 5 个字符..

还有一个问题,因为这本质上是一个字符串,我需要通过解析字符串中的每个字符并检查相应的 ASCII 值(对于数字)来验证输入是否仅为数字。对吗?

【问题讨论】:

  • 这听起来很像家庭作业

标签: c++ string input


【解决方案1】:

不幸的是,没有可移植的方法来限制 C++ 中输入的字符数。但是无论您使用什么平台都会提供一些机制:例如在 Windows 上,查找 Console functions

如果您使用来自cin 的普通旧C++ iostreams 输入,最好使用istream&amp; getline(istream&amp;, string&amp;) 将初始文本读入std::string——这将防止缓冲区溢出,因为strings 调整大小有必要的。 (涉及getline(InputMain, 5, '\n') 的代码在技术上是安全的,因为它不会将超过 5 个字符读入InputMain,但是此代码很脆弱——如果您以后决定需要 6 个字符,您很容易忘记更新您的通话到malloc(),导致崩溃。另外,你需要记住free(InputMain)。但正如我所说,改用string。)

关于解析:

无论您是使用getline(cin, str) 或某些特定于平台的代码将输入读入string,一旦输入,您需要以数字的形式将其取出。这就是 istringstream 类有用的地方——它允许您将现有的 string 视为要读取的流,因此您可以使用格式化输入 &gt;&gt; 运算符:

string str;
if (!getline(cin, str)) {
    cerr << "Something went seriously wrong...\n";
}

istringstream iss(str);
int i;
iss >> i;    // Extract an integer value from the stream that wraps str

if (!iss) {
    // Extraction failed (or a more serious problem like EOF reached)
    cerr << "Enter a number dammit!\n";
} else if (i < 1000 || i > 9999) {
    cerr << "Out of range!\n";
} else {
    // Process i
}

如果您使用的是 C++ iostream,实际上您可以直接从 cin 提取,而不是通过 stringistringstream

int i;
cin >> i;    // Extract an integer value from cin

但是,这可能会产生微妙的不良影响;值得注意的是,用户键入的行上的任何其他字符(特别是当他们按 Enter 时键入的'\n')将保留在输入缓冲区中,以供下一次&lt;&lt; 操作读取。通常这无关紧要,但有时确实如此:例如如果您跟进cin.get();,预计这将等待按键,它不会 - 它只会读取'\n'(或用户键入的第一个非数字字符)。

【讨论】:

  • 你的意思是我应该使用这样的东西吗? #include #include using namespace std; int main() { 字符串 InputMain; cout > InputMain; //---> 这也可以吗? cout
  • @halluc1nati0n:抱歉,我给出了两种替代方法,而不是单一方法。我会尝试修复帖子以澄清事情。
  • @halluc1nati0n:好的,现在看一下。简而言之:不,不要使用“cin >> InputMain;” -- 要么使用 "int i; cin >> i;"或“字符串 s; getline(cin, s); int i; istringstream iss(s); iss >> i;”。
  • @ j_random_hacker :我确实喜欢 istringstream 方法。我添加了 sstream 标头并且代码确实可以编译,但不知何故我没有让它工作。有什么原因吗?
  • @halluc1nati0n:一旦我添加了 iostream 和 sstream 标头,就可以使用,添加“使用命名空间 std;”在此之下并将代码 sn-p 包装在 main() 中。此外,如果您希望用户在号码无效时重新输入号码,您显然需要更改错误处理代码(例如,添加一个 while 循环并在号码有效时中断)。
猜你喜欢
  • 1970-01-01
  • 2018-11-06
  • 2010-09-05
  • 1970-01-01
  • 1970-01-01
  • 2019-10-07
  • 2015-06-23
  • 1970-01-01
  • 2016-02-26
相关资源
最近更新 更多