0

我正在尝试输入一个字符串。当我输入类似John.

但是,如果我输入类似的内容,John Smite我最终会陷入无限循环和终端崩溃。

string fullname;

do{
    cout << "Please input the Full Name of the user: ";
    cin >> fullname;
}while(fullname=="");
4

3 回答 3

1

这个空间正在扔掉cin。你应该使用getline。

于 2012-08-14T14:25:33.407 回答
1

你可以试试这个:

do{
cout << "Please input the Full Name of the user: ";
cin >> fullname;
}
while(fullname.length() == 0);
于 2012-08-14T14:29:17.593 回答
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());
于 2012-08-14T14:55:10.710 回答