C++ 基本cout/cin问题

C++ 基本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>>输入之后,我还有两个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 == "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”字符串包含的内容。