先看下string在标准输入的读取过程
string对象会自动忽略开头的空白 (既空格符,换行符,制表符等)并从一个真正的字符开始读起,直到遇见下个空白符为止(所以这个空白符(可能是空格,也可能是换行符等等)是不会被读取的,所以它还会保存在标准输入流中),所以string会忽略空白符,并且读取到真正字符后,一遇到空白符就结束读取。
getline()函数概念
getline()函数是一个输入流和一个string对象,函数从给定的输入流中读入内容,直到遇到换行符位置,(注意换行符也被读进来了,但并把换行符存到string对象中) 这样就可能导致getline() 在前面有输入的情况下读入缓冲区遗留的回车导致读入string是空的
举个例子
#include<bits/stdc++.h>
using namespace std;
int main(){
string s1,s2;
cin >> s1;//读入第一个string
for(int i = 0;i < 2;i++){//再读入两行
getline(cin,s2);
if(s2.empty())//如果空串输出提示
cout << "empty" << endl;
cout << s2 << endl;
}
system("pause");
return 0;
}
所以在读入指定行时,要注意使用getline()时要把缓冲区的回车清空,比如用getchar(),防止读入空string影响程序运行结果
#include<bits/stdc++.h>
using namespace std;
int main(){
string s1,s2;
cin >> s1;//读入第一个string
for(int i = 0;i < 2;i++){//再读入两行
getline(cin,s2);
if(!s2.empty())
cout << s2 << endl;
else i--;
}
system("pause");
return 0;
}