输入字符串时用cin无限循环,而数字是预期的

在下面的循环中,如果我们输入字符作为cin输入而不是预期的数字,那么它进入无限循环。 任何人都可以向我解释为什么发生这种情况?

当我们使用cin ,如果输入不是数字,那么是否有办法检测这个以避免上述问题?

 unsigned long ul_x1, ul_x2; while (1) { cin >> ul_x1 >> ul_x2; cout << "ux_x1 is " << ul_x1 << endl << "ul_x2 is " << ul_x2 << endl; } 

那么你总是会有一个无限循环,但我知道你真正想知道的是为什么cin不会在每个循环迭代中保持提示输入,导致你的无限循环自由运行。

原因是因为cin在你描述的情况下失败了,不会再读这些变量的输入。 通过给cin坏输入,cin进入失败状态并停止提示命令行输入导致循环自由运行。

对于简单的验证,您可以尝试使用cin通过检查cin是否处于失败状态来验证您的输入。 当失败发生时清除失败状态并强制流丢弃不良输入 。 这将返回cin到正常的操作,所以你可以提示输入更多的信息。

  if (cin.fail()) { cout << "ERROR -- You did not enter an integer"; // get rid of failure state cin.clear(); // From Eric's answer (thanks Eric) // discard 'bad' character(s) cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); } 

对于更复杂的验证,您可能希望首先读入字符串,然后对字符串进行更复杂的检查,以确保它与您期望的匹配。

注意

请注意以下解决方案。 目前尚不清楚您的案例中的错误。 你仍然会得到一个无限循环!

 if (cin.fail()) { cout << "Please enter an integer"; cin.clear(); } 

完整解决方案

原因是你需要清除流的失败状态,以及丢弃未处理的字符。 否则,糟糕的角色仍然存在,你仍然有无限循环。 你可以简单地可以std :: cin.ignore()来实现这一点。 例如,

 if (cin.fail()) { cout << "Please enter an integer"; // clear error state cin.clear(); // discard 'bad' character(s) cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); } 

另一个方案

你也可以使用getlinestringstream来实现。 这是一个简单的例子。

  string input; while (1) { getline(cin, input); stringstream(input) >> x; cout << x << endl; } 

也许,这是因为,

  1. cin是一个流媒体功能。 当输入一个非数字而不是数字时,它将被忽略。 并提示您重新输入。
  2. 即使你给了数字输入,你也会被提示输入更多的信息,因为你处于无限循环。

你可以像这样解决这个问题:1.创建一个函数来接受一个字符串输入。 2.转换后以数字形式返回。 使用strtod()进行转换。

希望这可以帮助 :)