在网上看别人的博客关于cin的解读,有感而发!解决了我心头的疑惑,所以在此进行记录。
参考博客源地址:(23条消息) cin、cin.get()、cin.getline()、getline()的区别_cin.getline()函数_啊大1号的博客-CSDN博客(23条消息) C++ while(cin>>a) cin输入直到回车结束_while(cin>>)什么时候结束_子木呀的博客-CSDN博客
(23条消息) 在while中使用cin>>a 为条件,注意事项_c++一次性输入多组数据__ dingding_的博客-CSDN博客
欢迎大家去上面博主的文章中了解更多!
输入原理简述:
程序的输入都建有一个缓冲区,即输入缓冲区。每次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据(cin读取数据是从第一个非空白字符开始到下一个空白字符结束)。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入。
比如下面的例子:
void test_input()
{ string str; cout<<"cin的测试:"<<endl; cin>>str; cout<<str<<endl; cin>>str; cout<<str<<endl;
}
由于cin在遇到空格/tab时,就会停止读取,所以如果我在第一次输入时,利用空格隔开两个字符串,那么cin在第一次取的时候,只会读取前一个字符串,到空格结束,此时缓冲区还保留着前面输入的第二个字符串,那么第二次cin就会直接从缓冲区取残留数据,而不会请求输入。
然后来说一下 C++ while(cin>>a) 问题
cin>>a是有返回值的,只要a满足类型条件,就会return true,一直执行下去,而cin会忽略空格或者enter,因此,enter后不会结束循环。只能ctrl+Z。
其实很简单:通过get()判断下一个输入是不是回车就行。
while(cin>>a){...if(cin.get()=='\n') break;
}
接下来我们来看一个例子:
#include<iostream>
using namespace std;
int main()
{int currVal = 0 , val = 0;if(cin >> currVal){int cnt=1;//统计次数while(cin >> val){if(currVal == val){cnt++;}else{cout << currVal <<" occurs "<<cnt<<" times "<<endl;currVal = val;cnt=1;//重新计算另一个 }} //while循环结束 cout << currVal <<" occurs "<<cnt<<" times "<<endl;//打印最后一个数 }//if循环结束 return 0;
}
测试用例输入1 2 3 4,会发现最后一个4的个数无法统计
这是因为现在程序还卡在while(cin>>val)中,可以选择ctrl+z结束,看下图:
或者增加一行代码:if(cin.get()=='\n') break;
#include<iostream>
using namespace std;
int main()
{int currVal = 0 , val = 0;if(cin >> currVal){int cnt=1;//统计次数while(cin >> val){if(currVal == val){cnt++;}else{cout << currVal <<" occurs "<<cnt<<" times "<<endl;currVal = val;cnt=1;//重新计算另一个 }if(cin.get()=='\n') break;} //while循环结束 cout << currVal <<" occurs "<<cnt<<" times "<<endl;//打印最后一个数 }//if循环结束 return 0;
}
当用例中‘4’被读入val后,cin.get()会得到‘4’后面的‘\n’回车符号,实现while(cin>>a)终止。
以上是我学习过程中的随记,所以写的知识点有点乱,还请各位看官老爷多多包涵!