我想输入一个字符串。当我输入如John
之类的东西时它工作正常。C++这是什么问题while while循环
但是,如果我输入类似John Smite
的东西,我会陷入无限循环和终端崩溃。
string fullname;
do{
cout << "Please input the Full Name of the user: ";
cin >> fullname;
}while(fullname=="");
我想输入一个字符串。当我输入如John
之类的东西时它工作正常。C++这是什么问题while while循环
但是,如果我输入类似John Smite
的东西,我会陷入无限循环和终端崩溃。
string fullname;
do{
cout << "Please input the Full Name of the user: ";
cin >> fullname;
}while(fullname=="");
该空间正在扔锡。你应该使用getline。
你可以试试这个:
do{
cout << "Please input the Full Name of the user: ";
cin >> fullname;
}
while(fullname.length() == 0);
事实上你甚至不需要一个while循环,因为cin一直等到输入一个合适的值。但也许你可以使用while循环,如果你将检查fullname是特殊的。 – 2012-08-14 14:34:28
@MihribanMNAZ:这取决于你的意思是“适当的”。如果适当,你的意思是一个非空行,然后否。 cin会在用户输入时留下空的fullname,我猜测OP会通过要求非空名称来防止这种情况。 – PlasmaHH 2012-08-14 14:35:56
string :: length的返回值的类型为'size_t',所以你的条件会比'(fullname.length()== 0)'更有意义。 – Derek 2012-08-14 14:38:55
至于为什么你得到一个无限循环 - operator>>
过载std::string
会先放弃任何前导空格,然后读取多达无论是下一个空格或avaliable输入结束。
当您输入“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());
对不起它不是一个for循环,错字 – user1595932 2012-08-14 14:24:54
什么是“全名”? – PlasmaHH 2012-08-14 14:25:21
全名是字符串 – user1595932 2012-08-14 14:27:43