字符串输入 - 忽略第一行

String input - first line being ignored

本文关键字:一行 输入 字符串      更新时间:2023-10-16

C ++和Java中的输入问题,如果我们在整数后输入一个字符串,它将跳过它转到下一条语句。

    string name;
int age;
cout<<"Enter age";
cin>>age;
cout<<"Enter name";
getline(cin,name);

cout<<name;
cout<<age;
getch();

上面的代码不取名称它跳过这一行。它有什么问题......???

当读取整数值时,引入以完成该行的 [Enter] 仍在流中,并且getline(cin,name)读取 [Enter]。

要解决此问题,请先刷新 cin 然后再获取字符串:

string name;
int age;
cout<<"Enter age";
cin>>age;
cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n'); // ignores all enters
cout<<"Enter name";
getline(cin,name);
cout<<name;
cout<<age;
getch();

我只回答C++,因为只有C++代码存在。

std::getline将使用前一个operator >>在输入流上留下的换行符,因此它返回。

一个简单的解决方法是忽略输入行上的所有剩余字符 cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n');

使用std::getline之前

#include<limits>
// ....
string name;
int age;
cout<<"Enter age";
cin>>age;
cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n');
cout<<"Enter name";
getline(cin,name);
std::cin >> age;
std::getline(std::cin, name);

假设用户输入整数 5。这是输入流的样子:

5n
...

请注意,上述内容可能会有所不同。用户可以输入整数,然后输入空格字符。这两种情况同样有效。

也就是说,用户输入值并点击返回以提交。 operator >>的格式设置为使用整数,但是一旦找到新行或空格提取将停止。输入操作后,新行应仍在流中。

n
...

现在,让我们看看name的内容:

n
"Bruce Wayne"n

getline执行时,一旦它在流中找到新行,它将停止搜索新输入。上一次提取的新行仍在流中,因此输入立即停止。什么都没有提取!

幸运的是,我们可以使用 ignore 方法从流中丢弃新行:

std::cin >> age;
std::cin.ignore(); // ignore the next character
std::getline(std::cin, age);

默认情况下,当给定 0 个参数时,std::cin.ignore 将丢弃流中的下一个字符。

这是一个活生生的例子