我正在尝试输入一个字符串。当我输入类似John
.
但是,如果我输入类似的内容,John Smite
我最终会陷入无限循环和终端崩溃。
string fullname;
do{
cout << "Please input the Full Name of the user: ";
cin >> fullname;
}while(fullname=="");
我正在尝试输入一个字符串。当我输入类似John
.
但是,如果我输入类似的内容,John Smite
我最终会陷入无限循环和终端崩溃。
string fullname;
do{
cout << "Please input the Full Name of the user: ";
cin >> fullname;
}while(fullname=="");
这个空间正在扔掉cin。你应该使用getline。
你可以试试这个:
do{
cout << "Please input the Full Name of the user: ";
cin >> fullname;
}
while(fullname.length() == 0);
至于为什么会出现无限循环 -operator>>
重载 forstd::string
将首先丢弃任何前导空格,然后读取到下一个空格或可用输入的末尾。
当您输入“John Smite”时,第一次迭代读取“John”,第二次迭代读取“Smite”,然后没有更多的输入用于后续迭代。fullname
问题是您的实现在尝试读取之前似乎已经清除了。但是由于流不再处于良好状态,因此无法再进行读取,并且存在无限循环。
你可以这样做:
string temp;
string fullname;
do {
cin.clear(); // clear any error flags
do {
if (cin >> temp) fullname += temp + ' ';
} while (cin.good());
} while (fullname.empty());
这有一个(好的)副作用,它会折叠多个相邻的空白字符,但它仍然很笨重。
更好的方法就是说
do std::getline(std::cin, fullname); while (fullname.empty());