2012-08-14 39 views
0

我想输入一个字符串。当我输入如John之类的东西时它工作正常。C++这是什么问题while while循环

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

string fullname; 

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

对不起它不是一个for循环,错字 – user1595932 2012-08-14 14:24:54

+0

什么是“全名”? – PlasmaHH 2012-08-14 14:25:21

+0

全名是字符串 – user1595932 2012-08-14 14:27:43

回答

1

该空间正在扔锡。你应该使用getline。

+0

http://stackoverflow.com/a/2616977/62671 – 2012-08-14 14:28:36

+2

不,这不是空间。亲自尝试一下。给出的代码片段(假设适当的包括等)对于输入像“John Smite”(其中“fine”意味着它不会崩溃,当然不会将所有单词放入fullname变量中)都可以正常工作。 – PlasmaHH 2012-08-14 14:34:10

+0

不应该因为std :: cin在空格上标记化而使“John Smite”产生与“John”相同的结果? – Derek 2012-08-14 14:35:42

1

你可以试试这个:

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

事实上你甚至不需要一个while循环,因为cin一直等到输入一个合适的值。但也许你可以使用while循环,如果你将检查fullname是特殊的。 – 2012-08-14 14:34:28

+0

@MihribanMNAZ:这取决于你的意思是“适当的”。如果适当,你的意思是一个非空行,然后否。 cin会在用户输入时留下空的fullname,我猜测OP会通过要求非空名称来防止这种情况。 – PlasmaHH 2012-08-14 14:35:56

+0

string :: length的返回值的类型为'size_t',所以你的条件会比'(fullname.length()== 0)'更有意义。 – Derek 2012-08-14 14:38:55

0

至于为什么你得到一个无限循环 - 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());