为什么格式化提取后 std::getline() 会跳过输入?


某些格式化提取后,std::getline() 会跳过输入。我们可以利用下面的代码简单地检查这个错误:-

示例代码

#include <iostream>
#include <string>
using namespace std;

int main(){
   string name;
   string city;

   if (cin >> name && getline(cin, city)){
      cout << "Your name " << name << " and city " << city;
   }
}

输出

Amal
Your name Amal and city

我们可以看到程序没有接受第二个输入。有时候它可以接受第二个输入,但在输出中只显示第一个输入。现在的问题是为什么会出现这种现象?

此问题的主要原因是,当我们编写第一个字符串时,我们按下了回车键或返回键。当按下回车键或返回键时,它会在当前行后面插入‘\n’字符。这个字符导致了该问题。它忽略了字符串的下一部分。

如果名称为“Amal”,那么它内部获取的是“Amal\n”。要解决这个问题,一个选择是在第一个提取后调用 std::cin.ignore()。然后它将丢弃下一个可用字符,这样就可以正常工作了。

更新于: 30-Jul-2019

408 次浏览

启动你的 职业生涯

通过完成课程获得认证

开始学习
广告