我在C++中处理输入流时遇到了一个有趣的问题。
我知道,如果您尝试使用cin
输入一个包含空格的字符串,它会在第一个空格处截断该字符串,除非您使用getline
来获取该字符串。
然而,我发现可能会出现更多意想不到的结果。。。如果在第一个输入之后有第二个cin
,并且第一个cin
的输入中有空格,则会跳过第二个输入,并对其值进行重击!
为什么会发生这种情况
#include <iostream>
#include <string>
using namespace std;
int main()
{
string myString;
int myInt;
// I know this will cut off the end of the string
cout << "Enter a string with spaces: ";
cin >> myString;
cout << endl;
cout << "Enter an integer: ";
cin >> myInt;
cout << endl;
cout << "String: " << myString << endl;
cout << "Int : " << myInt << endl;
return 0;
}
输出:
Enter a string with spaces: This is a string
Enter an integer:
String: This
Int : -858993460
有没有办法捕捉这个错误,这样无知的用户就不会输入带空格的字符串并破坏整个程序
从cin
读取不会读取整行,然后只返回其中的一部分。从概念上讲,它读取一个"token",通常理解为空白分隔的字符串,然后将其解析为您正在读取的任何类型。它没有"线"的概念。所有输入行都是一个连续的令牌流。因此,在读取字符串("This")后,下一个标记是"is",当然不能将其解析为int,因此也不能将错误解析为int。