前两天华为笔试,被c++输入坑惨了。有一道题是输入一个矩阵,先输入矩阵的行和列n*m,然后输入了n行字符串,一行字符串就是一行数据。我一开始用cin>>n>>m把行和列读进来,然后再执行n次getline(cin,str)把这n行字符串读进来。结果不知道怎么回事一直少读了一行字符串。下来看了一些博客才终于搞清楚错在哪里了。原来是因为cin>>n>>m的时候输入缓冲区里面还残留了一个n。所以第一次getline的时候读的是这个n,导致我的输入一直有问题。于是现在要把c++的输入总结一下,以免后面笔试再出一些乱七八糟的幺蛾子。
c++输入的方式每个程序都有一个输入缓冲区,当我们从键盘输入数据过后这些数据会被存入输入缓冲区,然后相应的输入函数直接从输入缓冲区当中取数据。当缓冲区中有残留数据时,输入函数会直接取得这些残留数据而不会请求键盘输入。因此我们梳理一下c++常见的这些输入函数是以怎样的方式从输入缓冲区当中取数据的。
cin>>cin>>它以空格和回车为结束符,并且它会忽略开头的空格和回车,直到遇见和输入类型匹配的字符才开始读取。也就是说,如果输入缓冲区中的字符以回车或者空格开头,那么cin>>会将这些回车或空格从输入缓冲区中取出并丢弃,直到碰到合法的字符,它才真正读取它,这样一直读取直到遇见空格或回车(它不会读这个空格或回车)。做个小实验,我们用cin读取m,n两个数,代码如下:
int m,n; cin>>m>>n; cout<<"m:"<然后我们从键盘输入字符,首先我们输入一个回车,然后再输几个空格,然后输4,然后再输几个空格,再输5,我们发现m和n被正常读进来了。于是这也证明了cin>>的确是像我们描述的这样工作的。
getline(cin,str)结束符为回车,同时可以读回车和空格。它将一行输入(这一行的开头字符不是回车)连着末尾的回车一起读进来。如果输入缓冲区的开始只有一个单独的回车,它也会将它当作一个完整的行。例如,我们想要输入3个字符串,首先我们输入一个回车,然后分别输入两个正常的字符串,最后我们得到的结果是第一次输入的回车被当做了一个字符串。
vectorkeep; string temp; for(int i=0;i<3;i++){ getline(cin,temp); keep.push_back(temp); } cout<<"一共读进来"< cin.get()
- 若是想读取多个字符进一个字符数组,参数为cin.get(数组名,长度,结束符)。结束符默认为ENTER,它不会读取并丢弃ENTER。它在没有遇到结束符之前最大能读长度-1个字符。例如我们想要读5个字符到字符数组str中,我们输入abcd然后输入回车,发现str数组中存放的是abcd,并且它不会丢弃回车。
char ch; char str[5]; cin.get(str,5); cin.get(ch); cout<
- 若是想读取单个字符,则使用cin.get(char ch)或ch=cin.get()。它应该没有结束符,它不会丢弃缓冲区中的ENTER或空格等。也就是说它在读取字符时,从键盘当中输入的每个字符它都会当做一个字符读取。例如我们想要输入三个字符,我们先从键盘输入一个a,再输入一个空格,一个回车,得到的结果如下,这三个字符都会正确读入。
char a,b,c; cin.get(a); cin.get(b); cin.get(c); cout< cin.getline()cin.getline(数组名,长度,结束符)与cin.get(数组名,长度,结束符)类似,但是cin.get()在输入的字符串超长时,不会引起cin的错误,后面的cin操作会继续执行,只是直接从缓冲区中取数据。但是cin.getline()当输入超长时,会引起cin函数的错误,后面的cin操作将不再执行。例如,我们使用cin.get()并输入超长个数的字符,然后再输入一个ch,观察结果,我们发现cin.get(ch)直接从输入缓冲区中取字符。
char ch='b'; char str[5]; cin.get(str,5); cin.get(ch); cout<
然后我们使用cin.getline()来同样输入4个字符,观察结果,我们可以发现程序并没有执行cin.get(ch),因为在cin.getline()时cin已经出错了。char ch='b'; char str[5]; cin.getline(str,5); cin.get(ch); cout<



