当我们先使用cin>>读取输入内容后再使用getline(cin,str)来读取字符串,则会遇到直接跳过后者读取操作的情况。假设我们现在需要先输入一个人的id和姓名并换行输出。
int id;
string name;
cin >> id;
getline(cin, name);
cout << "id: " << id << endl;
cout << "name: " << name << endl;
1313
id:1313
name:
可以看到,我们还没输入name的值就直接跳到输出代码了。
原因:
当使用cin>>读取字符串时,运算符会直接忽略第一次遇到的空白(空格、制表符和换行符)读取字符直到读取到下一次的空白并且将遇到的空白保留在输入序列中。而getline()方法会读取整行的数据(包括空格、制表符和换行符),并且用回车键输入的换行符来确定输入结尾,然后将换行符丢弃。因此,当我们先使用cin>>读取了一个人的id后,输入序列中留下了换行符;当使用getline()方法时,会先读取到换行符并判断已经到输入结尾了,所以字符串name中没有任何数据。
解决方法1:
在第一次输入后使用C++标准输入流中的一个方法——cin.ignore(a,ch)。它表示从输入流 cin 中提取字符,提取的字符被忽略,不被使用。而每抛弃一个字符,它都要进行计数和比较字符:如果计数值达到 a 或者被抛弃的字符是 ch ,则cin.ignore() 函数执行终止;否则,它继续等待。如果不设置参数,则把EOF前的1个字符清掉,没有遇到EOF就清掉一个字符然后结束(a的默认值为1,ch的默认值为EOF)。
详细用法参考:cin.ignore()的用法
int id;
string name;
cin >> id;
cin.ignore();
getline(cin, name);
cout << "id: " << id << endl;
cout << "name: " << name << endl
解决方法2:
在第一次输入后使用不带任何参数的cin.get()方法,它可以直接读取下一个字符(即使是换行符)。
int id;
string name;
cin >> id;
cin.get();
getline(cin, name);
cout << "id: " << id << endl;
cout << "name: " << name << endl;
解决方法3:
再读一次getline