出现的问题
当我们平常使用cin>>输入时,如果在输入中包含了空格,结果可能不会如我们预期所料。
这是因为,在使用普通的cin输入时,如果遇到了空格和tab,则会发生和换行一样的效果,结束当前cin输入。
string s1,s2;
cin>>s1>>s2;
cout<<s1<<endl<<s2;
若此时输入a (空格) b,则结果如下
可以看到,空格后的输入直接跳到了对s2的cin输入中,为解决这个问题,我们需要用到cin.getline和cin.get函数。
cin.getline( )
cin.getline(数组名x,数据长度y,结束符z)
将输入的 前y个字符存入x中,遇到结束符z或换行符后结束输入,最后丢弃换行符
cin.getline可以输入空格和tab,而不会结束当前输入,但是当输入长度超过y时,会产生cin错误。
cin.get( )
cin.get(数组名x,数据长度y,结束符z)
cin.get的用法和cin.getline几乎一样,但是cin.get不会丢弃换行符,而且输入长度超过y时,不会产生cin错误。
丢弃换行符
什么是丢弃换行符?
丢弃换行符指的是,在我们希望一个输入结束时,会使用换行符enter来结束当前输入,如果不丢弃该换行符,则该换行符会留在缓冲区内,被下一个cin.get( )输入接收。
也就是说下一个cin.get( )输入会直接读取到换行符,然后自动结束。
(值得一提的是,未被丢弃的换行符只会被cin.get和cin.getline接收,而不会被cin>>接收)
char s1[10],s2[10];
cin.get(s1,10);
cin.get(s2,10);
cout<<"输出结果为"<<endl<<s1<<endl<<s2;
这时,我们只输入了a,然后按下换行键就结束了所有输入。
如果在使用cin.get时想避免这种问题,可以在每个cin.get之后跟上一个空的cin.get( )。
char s1[10],s2[10],s3[10];
cin.get(s1,10);
cin.get();
cin.get(s2,10);
cout<<"输出结果为"<<endl<<s1<<endl<<s2<<endl<<s3;
这样则可以正常输入
cin错误
由于本文提到cin错误主要是为了讲述cin.get和cin.getline的区别,故不做过多描述。
当cin遇到输入错误(长度超出、输入类型不匹配)或者EOF条件时,程序都会无法再进行cin输入。
这时需要用到cin.clear( )清除错误标记。
cin.getline长度超出错误
char s1[10],s2[10],s3[10];
cin.getline(s1,5); //设置输入长度限制为 5
cin.getline(s2,10);
这里我们对s1的输入长度超过了5时,发生了cin错误,这时程序无法进行cin输入,故跳过了对s2的输入。
当我们使用cin.clear()清除了错误标记时,上次超出长度限制的输入会留在缓冲区,这时我们需要使用一个s3来接收超出s1输入长度留在缓冲区的数据,否则该数据会直接输入到s2中。
char s1[10],s2[10],s3[10];
cin.getline(s1,5); //限制输入长度为 5
//这里会发生cin错误
cin.clear(); //删除错误标记
cin.getline(s3,10) ; //用来接收上次缓冲区中超出长度的数据
cin.getline(s2,10);
cout<<endl;
cout<<"输出结果为"<<endl <<"s1="<<s1<<endl<<"s2="<<s2;
cout<<endl<<endl<<"超出s1长度的输入="<<s3;
这时我们输入123456789和我是s2
可以看到因为我们限制了输入的长度为5,所以只有1234存入了s1,超出了s1输入长度的56789在我们使用cin.clear()后被存入了s3中,最后我们成功将"我是s2"正确输入到了s2中。
类型不匹配的cin错误
当输入的类型和变量不匹配时,cin将返回false,而且不匹配的输入会留在输入队列中,
这时需要用到cin.clear( ) 来清除错误标记,然后用一个cin.get( )来删除上一次的错误输入。
有用的话点个赞再走吧(⊙﹏⊙)