猿问

在CIN之后使用getline(CIN,s)

在CIN之后使用getline(CIN,s)

我需要下面的程序来获取整个用户输入并将其放入字符串名称中:

cout << "Enter the number: ";int number;cin >> number;cout << "Enter names: ";string names;getline(cin, names);

带着cin >> number命令之前的命令。getline()命令(我猜这是问题所在),它不允许我输入名称。为什么?

我听说了一些关于cin.clear()命令,但我不知道这是如何工作的,也不知道为什么这是必要的。


jeck猫
浏览 942回答 3
3回答

互换的青春

cout&nbsp;<<&nbsp;"Enter&nbsp;the&nbsp;number:&nbsp;";int&nbsp;number;if&nbsp;(cin&nbsp;>>&nbsp;number){ &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;throw&nbsp;away&nbsp;the&nbsp;rest&nbsp;of&nbsp;the&nbsp;line&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;c; &nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(cin.get(c)&nbsp;&&&nbsp;c&nbsp;!=&nbsp;'\n') &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!std::isspace(c)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cerr&nbsp;<<&nbsp;"ERROR&nbsp;unexpected&nbsp;character&nbsp;'"&nbsp;<<&nbsp;c&nbsp;<<&nbsp;"'&nbsp;found\n"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(EXIT_FAILURE); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;<<&nbsp;"Enter&nbsp;names:&nbsp;"; &nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;name; &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;keep&nbsp;getting&nbsp;lines&nbsp;until&nbsp;EOF&nbsp;(or&nbsp;"bad"&nbsp;e.g.&nbsp;error&nbsp;reading&nbsp;redirected&nbsp;file)... &nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(getline(cin,&nbsp;name)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...use&nbsp;name...}else{ &nbsp;&nbsp;&nbsp;&nbsp;std::cerr&nbsp;<<&nbsp;"ERROR&nbsp;reading&nbsp;number\n"; &nbsp;&nbsp;&nbsp;&nbsp;exit(EXIT_FAILURE);}在上面的代码中,这一点.。&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;c; &nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(cin.get(c)&nbsp;&&&nbsp;c&nbsp;!=&nbsp;'\n') &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!std::isspace(c)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cerr&nbsp;<<&nbsp;"ERROR&nbsp;unexpected&nbsp;character&nbsp;'"&nbsp;<<&nbsp;c&nbsp;<<&nbsp;"'&nbsp;found\n"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(EXIT_FAILURE); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}.在数字只包含空格后检查输入行的其余部分。为什么不直接使用忽略呢?太冗长了,所以用ignore之后的小溪上>> x是一种推荐的替代方法,可以将内容丢弃到下一个换行符,但这样做可能会丢弃非空白内容,从而忽略文件中损坏的数据。您可能关心还是不关心,这取决于文件的内容是否可信,避免处理损坏数据的重要性等等。那么你什么时候才会使用“清除”和“忽略”呢?所以,std::cin.clear()(和std::cin.igore())并不是必需的,但是对于删除错误状态很有用。例如,如果您想给用户许多机会输入一个有效的数字。int&nbsp;x;while&nbsp;(std::cout&nbsp;<<&nbsp;"Enter&nbsp;a&nbsp;number:&nbsp;"&nbsp;&& &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;!(std::cin&nbsp;>>&nbsp;x)){ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(std::cin.eof()) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cerr&nbsp;<<&nbsp;"ERROR&nbsp;unexpected&nbsp;EOF\n"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(EXIT_FAILURE); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;std::cin.clear();&nbsp;&nbsp;//&nbsp;clear&nbsp;bad/fail/eof&nbsp;flags &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;have&nbsp;to&nbsp;ignore&nbsp;non-numeric&nbsp;character&nbsp;that&nbsp;caused&nbsp;cin&nbsp;>>&nbsp;x&nbsp;to &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;fail&nbsp;or&nbsp;there's&nbsp;no&nbsp;chance&nbsp;of&nbsp;it&nbsp;working&nbsp;next&nbsp;time;&nbsp;for&nbsp;"cin"&nbsp;it's &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;common&nbsp;to&nbsp;remove&nbsp;the&nbsp;entire&nbsp;suspect&nbsp;line&nbsp;and&nbsp;re-prompt&nbsp;the&nbsp;user&nbsp;for &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;input. &nbsp;&nbsp;&nbsp;&nbsp;std::cin.ignore(std::numeric_limits<std::streamsize>::max());}难道就不能用跳过或类似的简单点吗?另一个简单但不成熟的替代方案ignore因为您最初的要求是使用std::skipws在阅读行之前跳过任何数量的空格.。if&nbsp;(std::cin&nbsp;>>&nbsp;number&nbsp;>>&nbsp;std::skipws){ &nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(getline(std::cin,&nbsp;name)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;....但是如果它得到像“1E6”这样的输入(例如,一些科学家试图输入1,000,000,但C+只支持浮点数的表示法),你就不会接受number设为1,和E6的第一个值name..另外,如果您有一个有效的数字,后面是一个或多个空行,那么这些行将被默默地忽略。

呼啦一阵风

cout&nbsp;<<&nbsp;"Enter&nbsp;the&nbsp;number:&nbsp;";int&nbsp;number;cin&nbsp;>>&nbsp;number;cin.ignore(256,&nbsp;'\n');&nbsp;//&nbsp;remaining&nbsp;input&nbsp;characters&nbsp;up&nbsp;to&nbsp;the&nbsp;next&nbsp;newline&nbsp;character &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;are&nbsp;ignoredcout&nbsp;<<&nbsp;"Enter&nbsp;names:&nbsp;";string&nbsp;names;getline(cin,&nbsp;names);
随时随地看视频慕课网APP
我要回答