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