cin>>
cin 是使用空白(空格、制表符和换行符)来确定字符串的结束位置,并清除遇到的空白缓冲;而字符串的开始位置是通过清除开头(若有)的空白缓冲来确定的。 假设在键盘键入:\t\t\tAlistair \tDreeb<Enter> 则输入缓冲区有:\t\t\tAlistair \tDreeb\n(关于缓冲输入,见Blog:关于C之缓冲输入)
1. cin >> chArr0;
2. cin >> chArr1;
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);
2. cin.getline(dessertArr, ArrSize);
3. cout << nameArr << " like " << dessertArr;
第2行,等待键盘输入,由此也佐证了,cin.getline()丢弃\n并从缓冲区清除了它。
1. cin.get(nameArr, ArrSize);
2. cin.get(dessertArr, ArrSize);
第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就是空行 。。。。。。
|