❥关于C++之cin>>cin.getlinecin.get提取字符串差异
Posted itzyjr
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了❥关于C++之cin>>cin.getlinecin.get提取字符串差异相关的知识,希望对你有一定的参考价值。
cin>>
cin
是使用空白(空格、制表符和换行符)来确定字符串的结束位置,并清除遇到的空白缓冲;而字符串的开始位置是通过清除开头(若有)的空白缓冲来确定的。
假设在键盘键入:\\t\\t\\tAlistair \\tDreeb<Enter>
则输入缓冲区有:\\t\\t\\tAlistair \\tDreeb\\n(关于缓冲输入,见Blog:关于C之缓冲输入)
1. cin >> chArr0;// 键盘输入:\\t\\t\\tAlistair \\tDreeb<回车>。这时chArr0=Alistair
2. cin >> chArr1;// chArr1=Dreeb(直接从缓冲区取,不等待键盘输入)
3. cin >> chArr2;// 等待键盘输入
在缓冲区中有\\t\\t\\tAlistair Dreeb\\n,第1行cin在提取字符时,首先清除连续的空白缓冲(三个制表符)到了开始位置’A’,接着是"listair",直到遇到了空格符,清除这个空格符缓冲并结束提取,所以chArr0=Alistair;第2行cin接着从剩余的缓冲区提取字符,开始清除制表符,然后从’D’开始,接着是"reeb",直到遇到了换行符,清除这个换行符缓冲并结束提取,所以chArr1=Dreeb。至此,缓冲区被完全清空了,第3行cin就无法从缓冲区提取到任何字符了,所以只能等待键盘输入了。
cin.getline()与cin.get()
相同点:cin.getline()
与cin.get()
都是以换行符来确定字符串的结束位置的。并且这两个函数都读取一行输入。
不同点:cin.getline()
丢弃换行符(也把换行符从缓冲区中清除了)。cin.get()
不丢弃换行符,保留在输入队列中(即,不清除换行符缓冲)。
1. cin.getline(nameArr, ArrSize);// 键盘输入:Dirk Hammernose
2. cin.getline(dessertArr, ArrSize);// 【等待】键盘输入:Radish Torte
3. cout << nameArr << " like " << dessertArr;// 打印:Dirk Hammernose like Radish Torte
第2行,等待键盘输入,由此也佐证了,cin.getline()丢弃\\n并从缓冲区清除了它。
1. cin.get(nameArr, ArrSize);// 键盘输入:Dirk Hammernose
2. cin.get(dessertArr, ArrSize);// dessertArr=\\n(直接从缓冲区取,不等待键盘输入)
第2行,直接从缓冲区提取到换行符,由此也佐证了,cin.get()没有清除换行符缓冲,而是将换行符保留在了输入队列中。
要修正程序的话,就这样:
cin.get(nameArr, ArrSize);
cin.get();// 读取\\n
cin.get(dessertArr, ArrSize);
输入的字符串比分配的空间长
如果输入行包含的字符数比指定的多,则cin.getline()和cin.get()将把余下的字符留在输入队列中,即下次会直接先从余下的字符缓冲中提取。不过cin.getline()还会设置失效位,并关闭后面的输入。
读取到空行
比如某些操作系统中换行是:\\r\\n,它或者它们占一行,从文本读取到就是空行。
当前C++的做法是:当cin.get()而不是cin.getline()读取空行后将设置失效位(failbit)。这意味着接下来的输入将被阻断,但可以用这条命令来恢复输入:cin.clear();
。
其实有很多判空的方法,比如:
string name;
ifstream in("C:/Users/Administrator/Desktop/save_paper.txt");
while (!in.eof())
getline(in, name);
if (name.empty())
continue;
......
或:
先getline(字符串)再strlen(字符串)==0就是空行
。。。。。。
以上是关于❥关于C++之cin>>cin.getlinecin.get提取字符串差异的主要内容,如果未能解决你的问题,请参考以下文章