最近当做题时及被同学询问时,发现cin、cin.getline()、getline()与换行符之间总是存在相应的输入错误问题,所以今天弄清楚了,现分享之,望有助于各位同仁
如果对这三种输入还不清楚的可以看一下这篇文章:几种输入字符串的方法
第一条关于cin的结论
我们可以清楚的看到,当键盘上输入’A’时,被ch接受,后面的换行符被str接受了并换成了’\0’,所以我们可以得出的结论时,cin不会舍弃掉换行符,换行符会被留置到输入流中
所以我们得出第一条结论:cin不舍弃换行符,换行符被留置输入流。
第二条关于getline()的结论
下面来看getline()
我们可以清楚的看到ch接受A后,cin.ignore()将输入流里面的换行符舍弃掉,所以str可以第一次正常的输入,输入完成以后还可以进行第二次输入,表明输入流里面并没有换行符,即第一次输入完成后的换行符并没有被留置到输入流中
所以我们得出第二条结论:getline()舍弃换行符,换行符不会被留置输入流。
第三条关于cin.getline()的结论
下面我们来看cin.getline(),由于cin.getline()特殊的输入性,所以我们接下来将从三种情况讨论
- 字符数组指定的接受输入大小没有被接受
我们可以看到此时当cin.getline()输入完成后,接受了换行符,并替换成’\0’。换行符没被留置到输入流中,所以ch才能再次输入
那这样看来cin.getline()也会丢弃换行符啊,其实不然,请看下面的情况
-
字符数组指定的接受输入大小被超出
现在看来当时这种情况时,情况比较复杂啊,本来输入流里面应该是’llo’,但是怎么变成这样了呢,是不是后面可以继续接受呢,我们再继续输入试试
看来情况比较复杂,全变成了空格
要尽量避免这种情况!! -
字符数组指定的接受输入大小正好被接受
这种情况与第一种情况一
所以我们得出第三条结论:
当cin,getline()指定的输入大小没有被超出时,cin.getline()舍弃换行符,换行符不会被留置输入流。
而当被超出时,情况比较复杂,基本不能继续进行输入了
总结
- cin不舍弃换行符,换行符被留置输入流
- getline()舍弃换行符,换行符不会被留置输入流
- 当cin,getline()指定的输入大小没有被超出时,cin.getline()舍弃换行符,换行符不会被留置输入流。而当被超出时,情况比较复杂,基本不能继续进行输入了
码字不易,如果本文对你有帮助,请给我一个三连支持一下,帮助推荐给更多的朋友,在他们挠头之时给予他们帮助,让他们恍然大悟。》。。。《
哪里不对,欢迎评论探讨!互相进步,愿你我都好!
关于解决办法,可以参考这篇文章。C++中getline()和cin()同时使用时的注意事项