c++输入注意事项
前两天华为笔试,被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:"<<m<<" n:"<<n<<endl;
然后我们从键盘输入字符,首先我们输入一个回车,然后再输几个空格,然后输4,然后再输几个空格,再输5,我们发现m和n被正常读进来了。于是这也证明了cin>>
的确是像我们描述的这样工作的。
getline(cin,str)
结束符为回车,同时可以读回车和空格。它将一行输入(这一行的开头字符不是回车)连着末尾的回车一起读进来。如果输入缓冲区的开始只有一个单独的回车,它也会将它当作一个完整的行。例如,我们想要输入3个字符串,首先我们输入一个回车,然后分别输入两个正常的字符串,最后我们得到的结果是第一次输入的回车被当做了一个字符串。
vector<string