C++这有什么问题,同时循环

C++ what is wrong with this do while loop

本文关键字:循环 问题 什么 C++      更新时间:2023-10-16

我正在尝试输入一个字符串。当我输入类似 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>> std::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());