【问题标题】:C++ getline(), the second run of this function doesn't workC++ getline(),第二次运行这个函数不起作用
【发布时间】:2012-11-10 21:50:06
【问题描述】:

我无法弄清楚我的简单 IO 问题是什么:

这是我执行 IO 的代码:

cout << "Enter an Employee name: ";
getline(cin, empName);
cout << "Employee Position: "  ;
cin >> empPos;
cout << "Enter the Number of Years of Experience: ";
cin >> numOfExp;
cout << "Enter the deprtment Number: ";
cin >> deptNum;

这是我的错误输出: 第一次读取名称时一切正常,但第二次看起来像是自动传递到名称中,而不要求用户输入任何名称。

这是我的输出:

Name:               Unknown
Department Number:          0
Employee Position:          E
Years of Experience:        0
Salary:                     0
Total Number of Employees:  1
Enter an Employee name: arasd d
Employee Position: s
Enter the Number of Years of Experience: 12
Enter the deprtment Number: 12
Name:                       arasd d
Department Number:          12
Employee Position:          s
Years of Experience:        12
Salary:                     0
Total Number of Employees:  1
Enter an Employee name: Employee Position:

如您所见,最后一行是问题所在; 知道如何解决这个问题吗?

【问题讨论】:

  • getline 在停止读取时表现不同。
  • 不要混用 getline&gt;&gt;。此外,您完全忘记检查任何输入操作的返回值。这基本上是一场灾难。
  • 此时我不做任何错误检查,我只是想确保程序在假设用户输入正确输入的情况下运行。
  • 至于混合getline和>>,我不知道如何读取输入之间有空格的字符串并将其存储到单个字符串变量中。

标签: c++ input getline


【解决方案1】:

问题可能是您在std::getline() 之前读取的最后一个内容是整数(或使用operator&gt;&gt;() 的其他内容。格式化输入运算符在遇到与其格式不匹配的第一个字符时停止读取。例如,对于整数读取,将停止输入非数字(前导符号除外)。因此,在读取整数后,用于指示输入完成的换行符仍在输入缓冲区中。

要处理卡住的换行符,您可以在调用 std::getline() 之前跳过任何前导空格:

if (std::getline(std::cin >> std::ws, name)) {
    ...
}

顺便说一句,永远不会出现您不想检查用户输入的情况!用户输入总是需要检查,即使在输入被假定正确的最琐碎的程序中!它有助于显着定位实际问题。鉴于您的输出,它看起来好像 tve 输入实际上与正在读取的内容不匹配......

【讨论】:

  • 谢谢,但我通过在最后输入 cin.ignore() 解决了这个问题,所以每次读取输入时它都会清除缓冲区。
  • 请注意,使用std::cin.ignore() 是一个不足的修复!尝试在换行符前面输入一个空格:123 \n,然后您就回到了原来的位置。如果您可能有前导空格或空名称,您可能想要使用std::cin.ignore(std::numeric_limits&lt;std::streamsize&gt;::max(), '\n');:这会跳过所需的字符以到达下一个换行符。就个人而言,我认为在格式化和未格式化 I/O 之间切换时使用 std::ws 更简单、更惯用。
  • 我想我不确定你想让我在哪里插入那段代码,但我用前导空格对其进行了测试,没有做任何修改,仍然有效。
  • 重点是,std::cin.ignore() 只是忽略了一个字符。如果您输入一个数字后跟一个空格,然后才输入,则当看到std::getline() 时,流就在换行符上。在这种情况下,您需要忽略多个字符。更准确地说,您需要忽略包括换行符在内的所有字符。这就是我之前评论中对std::cin.ignore() 的调用所做的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-05
  • 2018-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多