当我们输入整数,按回车,实际上输入的是:整数和换行符号(\n)。cin把整数读进了,但是换行符号没有读,因此如果接下来输入字符串,即使用cin.getline,首先会读入\n。然后就直接结束了。
下面这个程序需要输入四个字符串并把它们打印出来,可以看到输入三条字符串之后就结束了。
#include<iostream>
#include<string>using namespace std;int main(){int num;string s, w;cin >> num;for (int ii = 0; ii<num; ++ii){getline(cin, s);cout << s << endl;}return 0;
解决方法:
在输入字符串之前先用cin.get()把之前的换行符吸收掉
#include<iostream>
#include<string>using namespace std;int main(){int num;string s, w;cin >> num;cin.get();for (int ii = 0; ii<num; ++ii){getline(cin, s);cout << s << endl;}return 0;
}
或者另一种方法,不用getline获取字符串,直接用cin>>string
#include<iostream>
#include<string>using namespace std;int main(){int num;string s, w;cin >> num;for (int ii = 0; ii<num; ++ii){cin>>s;cout << s << endl;}return 0;
}
这是因为cin>>会自动过滤掉不可见字符(如空格 回车 tab等)
当cin>>从缓冲区中读取数据时,若缓冲区中第一个字符是空格、tab或换行这些分隔符时,cin>>会将其忽略并清除,继续读取下一个字符,若缓冲区为空,则继续等待。但是如果读取成功,字符后面的分隔符是残留在缓冲区的,cin>>不做处理。