c++和java中的输入问题如果我们在一个整数之后输入一个字符串,它将跳过它转到下一个语句。
string name;
int age;
cout<<"Enter age";
cin>>age;
cout<<"Enter name";
getline(cin,name);
cout<<name;
cout<<age;
getch();
上面的代码没有命名它跳过这一行。它有什么问题......???
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
将使用 previous 留在输入流中的换行符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。这就是输入流的样子:
5\n ...
请注意,上述内容可能会有所不同。用户可以输入一个整数,然后输入一个空格字符。两者都是同样有效的情况。
即用户输入值并点击返回提交。operator >>
被格式化以便使用整数,但是一旦找到新行或空格提取将停止。在输入操作之后,新行应该仍然在流中。
\n ...
现在,让我们看看以下内容name
:
\n "Bruce Wayne"\n
执行时getline
,一旦在流中找到新行,它将停止搜索新输入。上次提取的新行仍在流中,因此输入立即停止。什么都没提取!
幸运的是,我们可以使用该ignore
方法从流中丢弃新行:
std::cin >> age;
std::cin.ignore(); // ignore the next character
std::getline(std::cin, age);
默认情况下,std::cin.ignore
当给定 0 个参数时,将丢弃流中的下一个字符。
这是一个活生生的例子。