【问题标题】:Multiple string store in different variable C++多个字符串存储在不同的变量 C++
【发布时间】:2013-02-07 09:36:30
【问题描述】:

这是我第一次在这里发帖,所以我会尽量明确我的问题。所以我需要在变量中存储带有空格的不同字符串。我正在使用 eclipse,但我遇到了问题。

这是代码

using namespace std;
string p_theme;   
string p_titre;
int p_anneeEdition;
string p_pays;
string p_auteur;
string p_editeur;
string p_isbn;

cout << "Veuillez saisir le thème:" << endl;
getline(cin, p_theme, '\n');


cout << "Veuillez saisir le titre:" << endl;
getline(cin, p_titre, '\n');

....

这就是控制台向我显示的内容

Veuillez saisir le thème:
Veuillez saisir le titre:

问题是我没有时间在第二个 cout 之前输入字符串“Theme”。我尝试了不同的方法,使用 char 缓冲区它不起作用我进入一个循环。

【问题讨论】:

  • 欢迎来到 SO。你的程序应该是short self-contained compilable example,这会让事情变得更容易。
  • 在这里回答了吗? stackoverflow.com/questions/7786994/…
  • @Nate:答案包括格式化的提取 cingetline。这里我们在cout 上使用格式化的输出,它不应该对getline 上的cin 调用产生任何影响。
  • @Zeta:答案涵盖getline(cin, ...) 不等待用户输入,这似乎正是这里报告的问题。我不确定我们谁误读了这个问题。

标签: c++


【解决方案1】:

一个什么都不做的getline可能有很多原因

  • 设置了故障位(因为读取 int 或类似内容失败)在这种情况下,所有从 cin 读取的调用都会被忽略。
  • 输入缓冲区中剩余未读字符。例如“\n”(如果您阅读 std::stringoperator&gt;&gt;,则可能是这样)。

要处理这两种情况,请插入

cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n'); 

在每次调用 getline 之前(并在文件顶部添加 #include &lt;limits&gt;)。

这肯定是矫枉过正,如果你小心,这可以减少。

  • 检查每个输入是否成功(如int i; if (std::cin &gt;&gt; i) { /* ok */ }
  • 不要在没有getline 的情况下阅读std::string(例如operator&gt;&gt;),除非您稍后调用cin.ignore(...)

如果你做了所有这些,代码应该可以像你已经拥有的那样工作。

【讨论】:

  • cin.clear()?为什么要清除错误标志?您当前的回答表明clear 可能会将流向不认识istreams 的人清除,然后他们可能会对您忽略其他值的原因感到困惑。请详细说明。
  • @Zeta:我不知道发布问题中getline 之前的代码。也许设置了一个故障位(这将导致发布的行为)。如果我知道真正的代码,在每次调用 getline 之前并不需要所有这些。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-06
  • 2018-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-17
相关资源
最近更新 更多