1、输入空格符
getline() 函数实际上有三个参数,第三个参数指定字符串的结束符,也就是当 getline() 函数遇到这个字符时,就不再接受输入了。例如
getline(cin, str, 's');
即使输入的是 abcsdef ,读入到 str 的内容却只有 abc ,因为遇到字符 ‘s’ 时,getline() 便停止读入了。
即输入 abcsabc 按回车键后,程序以 enter 作为输入完成的信号,getline() 函数开始读入缓冲区的内容,它将结束符 ‘s’ 前的部分读入到变量 str ,舍弃结束符 's' 及其后面的部分。
下面这段代码需要按两次回车键才能执行 cout 进行打印,则是因为 getline() 默认情况下以回车 ('/n') 作为结束符。第一次按回车时, getline() 将其作为读入的结束符,而非输入完成信号,第二次按回车才是输入完成的信号。
#include<iostream>
#include<string>
using namespace std;
int main(){
string s;
getline(cin,s);
cout<<s;
return 0;
}
(本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lengyuhong/archive/2009/10/12/4659724.aspx)
那么,当程序循环调用 getline(cin, s) 时,如果不做任何处理,每隔一次的开头输入都是上次的输入完成信号即 enter,由于 getline() 并不忽略行开头的换行符,只要 getline() 遇到换行符,哪怕是第一个字符,getline() 也会将它作为本次输入的字符串结束符,它将会把本次输入的内容舍弃,而将开头的 enter 之前的部分(为空字符)读入到目标变量 ,导致第二次调用时读入变量的是空字符。
可以使用小节 2 中给出的方法解决该问题。
2、使用 cin.clear() 或 cin.ignore() 跳过最开始的终止符。例如
#include<iostream>
#include<string>
using namespace std;
int main() {
char str[8];
cin.getline(str, 5);
cout << str << endl;
cin.clear(); // 如果这里没有 clear,那么下面的输入就被忽略了,因为 cin 标志未清除
cin.getline(str, 5);
cout <<str <<endl;
system( "pause ");
return 0;
}
也可以用 cin.ignore(1)忽略一个字符,或cin.ignore(1024,'/n'),在遇到换行后或者忽略了1024个字符后不再忽略。