C++ 基本cout/cin问题
在cin>>输入之后,我还有两个cin部分。出于某种原因,它跳过了获取名称的getline。输入后,它显示Name:Status:然后执行状态的getlineC++ 基本cout/cin问题,c++,stdin,C++,Stdin,在cin>>输入之后,我还有两个cin部分。出于某种原因,它跳过了获取名称的getline。输入后,它显示Name:Status:然后执行状态的getline cin >> Input; { if(Input == "a") Position = "first"; else if(Input == "b") Position = "second"; else if (Input == "c") Position = "third"; else if(Input =
cin >> Input; {
if(Input == "a")
Position = "first";
else if(Input == "b")
Position = "second";
else if (Input == "c")
Position = "third";
else if(Input == "Stop")
break;
}
cout我想应该是这样的:
cout << "Name: ";
getline(cin, Name);
if(Name == "Stop")
break;
cout << "Status: ";
getline(cin, Status);
if(Status == "Stop")
break;
请参阅,当您从stdin中读取一些文本时,字符串结束由\n
确定(默认情况下)。当您在控制台窗口中点击回车键时,将跳过此符号,但它仍然存在。因此,当您试图读取下一个字符串时,它会遇到以前忘记的\n
,并终止读取,返回一个空字符串
详细信息请阅读。我认为应该是这样的:
cout << "Name: ";
getline(cin, Name);
if(Name == "Stop")
break;
cout << "Status: ";
getline(cin, Status);
if(Status == "Stop")
break;
请参阅,当您从stdin中读取一些文本时,字符串结束由\n
确定(默认情况下)。当您在控制台窗口中点击回车键时,将跳过此符号,但它仍然存在。因此,当您试图读取下一个字符串时,它会遇到以前忘记的\n
,并终止读取,返回一个空字符串
阅读了解详细信息。问题在于大多数输入操作将在输入缓冲区中保留换行符(但不是getline()
),更多信息如下。
在您的情况下,这一行:
cin.getline(whatever);
cin.ignore(1, '\n');
将留下/n
,稍后将其馈送到:
cin >> Input; {
快速解决方案:
替换cin>>输入代码>带有getline(cin,输入)代码>问题是大多数输入操作将在输入缓冲区中保留换行符(但不是getline()
),更多信息如下。
在您的情况下,这一行:
cin.getline(whatever);
cin.ignore(1, '\n');
将留下/n
,稍后将其馈送到:
cin >> Input; {
快速解决方案:
替换cin>>输入代码>带有getline(cin,输入)代码>cin>>somevar
留下了一条新行。无论somevar的类型是什么,即使它是std::string,该语句也不会读取行尾字符。因此,当您到达名称部分时,您将读取somevar
行的末尾,该行显然是空的。在尝试读取名称之前输入一个getline,应该可以了。cin>>somevar
会留下一个新行。无论somevar的类型是什么,即使它是std::string,该语句也不会读取行尾字符。因此,当您到达名称部分时,您将读取somevar
行的末尾,该行显然是空的。在尝试读取名称之前输入一个getline,应该没问题。为什么要暂停?我认为您可能需要更完整的代码来理解如何回答这个问题。还有,名称和状态等是字符串还是字符数组?你的很多问题都留给猜测。姓名和状态是字符串。中断是退出while循环。为什么要中断?我认为您可能需要更完整的代码来理解如何回答这个问题。还有,名称和状态等是字符串还是字符数组?你的很多问题都留给猜测。姓名和状态是字符串。中断是退出while循环。“存在”在哪里?请定义“遗忘”。\n
存在于标准数据流中。遗忘意味着cin.getline()
忘记从流中读取\n
,因此无论什么字符串(请参阅我的答案“code”)中的最后一个字符是\0
,我部分同意这一点,但不要认为getline()会留下\n
,除非您没有按两次enter键。通过管道将文本文件传输到包含windows crlf编码的standart input更接近事实。@Andrejs同意。但是*nix终端怎么了?如果是的话?如果没有这个“修复”,我无法正常读取字符串…@shybovycha-没有必要在你告诉OP的地方放置忽略。1) 这不是问题所在,getline()已经从流中读取了2'\n'。我不知道你的答案为什么被加了-完全是错的。真的,整件事你都没说对。抱歉,如果你被冒犯了,但这是真的。“存在”在哪里?请定义“遗忘”。\n
存在于标准数据流中。遗忘意味着cin.getline()
忘记从流中读取\n
,因此无论什么字符串(请参阅我的答案“code”)中的最后一个字符是\0
,我部分同意这一点,但不要认为getline()会留下\n
,除非您没有按两次enter键。通过管道将文本文件传输到包含windows crlf编码的standart input更接近事实。@Andrejs同意。但是*nix终端怎么了?如果是的话?如果没有这个“修复”,我无法正常读取字符串…@shybovycha-没有必要在你告诉OP的地方放置忽略。1) 这不是问题所在,getline()已经从流中读取了2'\n'。我不知道你的答案为什么被加了-完全是错的。真的,整件事你都没说对。对不起,如果你被冒犯了,但这是真的。哈!比你快一小时。我的答案也不会改变“输入”字符串包含的内容。哈哈!比你快一小时。我的答案也不会改变“Input”字符串包含的内容。