【问题标题】:Getline not working as intended with stringsGetline 无法按预期使用字符串
【发布时间】:2015-04-18 14:10:07
【问题描述】:

我基本上是在尝试获取用户的名称(我希望他们能够使用空格,这就是我必须使用 getline 的原因),然后是他们虚构王国的名称。但是当我运行这段代码时,它会自动跳过。它会询问名称,但随后它会跳过并询问王国名称,然后才允许用户输入他们的姓名。我试过 cin.ignore() 但这不起作用。有人有什么建议吗?

string playerName = "nyd"; //declaring string playerName
string kingdomName = "nyd"; //declaring string countryName
int monarchAge; //declaring monarch age variable.

cout << "     Welcome, your majesty! What is your name?\n";
getline(cin,playerName);
cout << "     And what is the name of your grand kingdom, " << playerName << "?\n";
getline(cin,kingdomName);
cin.ignore();
cout << "     And finally, how old are you, Lord " << playerName << " of " << kingdomName << "?\n";
cin >> monarchAge;

【问题讨论】:

  • 很可能是stackoverflow.com/questions/21567291/…,而对ignore的调用很可能只是吃掉了这个时代的第一个字符。
  • 你为什么打电话给cin.ignore();
  • 我在某处读到 cin.ignore() 可能会有所帮助,所以我试了一下,但猜不出来
  • @JacobOaks 您在某处读到的有关 cin.ignore 的提示是针对将 cin &gt;&gt; v;getline 混合使用的,这是因为 operator&gt;&gt;(istream&amp;, T) 通常会忽略行尾的换行符。跨度>

标签: c++ string getline


【解决方案1】:

您提供的代码的 sn-p 实际上是正确的。当我在本地编译它时,我得到了预期的行为。

我仍然认为我可以告诉您代码中发生了什么。我假设您链接的 sn-p 只是您程序的一部分,在失败的代码很可能出错之前。类似于尝试将浮点数读入整数变量或类似的东西。这将导致您的流(在本例中为 cin)被标记为错误。

一旦流被标记为错误,它将简单地忽略所有未来对getline()operator&gt;&gt; 的调用,直到调用cin.clear() 来重置错误标志。

所以解决方法是,找出是什么让你的流不好。

【讨论】:

  • 非常感谢!尽管我的代码早期在程序中存在问题,但我永远不会想到,现在该问题已修复并且一切正常。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-30
  • 1970-01-01
  • 2021-10-11
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
  • 2020-04-23
相关资源
最近更新 更多