1.问题的提出
#include<bits/stdc++.h>
using namespace std;
int main()
{
vector<string> my;
int n;char ch;
cin>>ch>>n; //(1)
// getchar(); //(2)
for(int i=0;i<n;i++){ //为啥第一行读进来的始终是空字符串???
string s;
getline(cin,s); //(3)
//输出读进来的字符串
cout<<"第"<<i<<"个s是"<<s<<endl;
my.push_back(s);
}
return 0;
}
解释一下代码的设计:
- 标号(1)处用cin语句读入一个字符和整数
- 标号(3)处用getline()语句循环n次读入n个string字符串
- 标号(2)处是后面更改用的,后面再说
问题:
原本的意思是:先输入ch和n,再依次输入n行字符串,存放在一个vector中。
如:
输入:
& 3
@@@
@
@@@
vector my中应当是:
my[0]"@@@"
my[1]" @ "
my[2]=="@@@"
实际输出:
问题:
第一个string没有输出应该输出的“@@@”,而是输出了一个“空字符”,或许是空格或许是回车或许是tab等等。
2.探究输出了什么
- cin的流输入特点:跳过缓冲区中的空白符,从第一个空白符开始输入,输入完成后遇到空白符作为界止符,停止输入。值得注意的是,此时这个“界止符还停留在缓冲区中”,如果是连续的两个cin,那么执行第二个cin时将跳过这个第一个cin的界止符开始输入。
- getline()以’\n’为界止符,当getline紧接上述cin,缓冲区中留下的‘\n’将被getline读到,进而结束第一次getline读入,并且将界止符’\n’丢弃,字符串长度为0 。
- 结论就是:什么都没输出,第一个string中是空的。
3.解决办法
用标号(2)的getchar()将这个多余的回车符读取即可。