cin、cin.getline()、getline()与换行符的恩怨情仇

最近当做题时及被同学询问时,发现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()特殊的输入性,所以我们接下来将从三种情况讨论

  1. 字符数组指定的接受输入大小没有被接受

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

我们可以看到此时当cin.getline()输入完成后,接受了换行符,并替换成’\0’。换行符没被留置到输入流中,所以ch才能再次输入


那这样看来cin.getline()也会丢弃换行符啊,其实不然,请看下面的情况

  1. 字符数组指定的接受输入大小被超出在这里插入图片描述在这里插入图片描述
    现在看来当时这种情况时,情况比较复杂啊,本来输入流里面应该是’llo’,但是怎么变成这样了呢,是不是后面可以继续接受呢,我们再继续输入试试
    在这里插入图片描述
    在这里插入图片描述
    看来情况比较复杂,全变成了空格
    要尽量避免这种情况!!

  2. 字符数组指定的接受输入大小正好被接受
    在这里插入图片描述

在这里插入图片描述
这种情况与第一种情况一
所以我们得出第三条结论:
当cin,getline()指定的输入大小没有被超出时,cin.getline()舍弃换行符,换行符不会被留置输入流。

而当被超出时,情况比较复杂,基本不能继续进行输入了

总结

  1. cin不舍弃换行符,换行符被留置输入流
  2. getline()舍弃换行符,换行符不会被留置输入流
  3. 当cin,getline()指定的输入大小没有被超出时,cin.getline()舍弃换行符,换行符不会被留置输入流。而当被超出时,情况比较复杂,基本不能继续进行输入了

码字不易,如果本文对你有帮助,请给我一个三连支持一下,帮助推荐给更多的朋友,在他们挠头之时给予他们帮助,让他们恍然大悟。》。。。《
哪里不对,欢迎评论探讨!互相进步,愿你我都好!
关于解决办法,可以参考这篇文章。C++中getline()和cin()同时使用时的注意事项

  • 23
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

撑一把纸伞.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值