关于cin、cin.get()和cin.getline()函数的使用方法详解,超详细!!!!

此文章是我在自己写代码时,每次结合使用不同的输入方法时,老是遇到各种奇奇怪怪的问题,得不到自己想要的输出结果,查阅了各种资料之后,总结如下:

cin的读取字符规则

cin遇到回车空格tab键 结束,但是缓冲区还存在这三个字符,并没有将这三个字符丢弃,且指针光标在这三个字符之前,也就是说,下一次通过其他输入函数读取时,是可以读到这三个字符的。

cin.get 的读取字符规则:

  1. 读取字符

以回车键结束,并且会将回车键作为一个字符读入,读完回车键之后,指针光标移到回车键后面,如果后面还有输入的话,会读取下一字符。故下图不会像后面读取字符串一样介绍的不跳过回车键

int main()
{


    int len=0;
    cin>>len;

    int j=0;
//    cin.ignore();
    while(len)
    {
        cout<<"len:"<<len<<endl;
        char str[100];

        cin.get(str[j]);
//        cin.ignore();

        cout<<"str:"<<int(str[j])<<'\t';
        j++;
        len--;
    }
    return 0;
}

如下所示,使用cin.ignore将回车符丢弃,程序便能够正常运行。

在这里插入图片描述

  1. 读取字符串

以回车键结束,读取到前面残留的回车会直接结束,并且指针光标不会跳过回车键,当输入3【回车】之后,再次使用cin.get,然后想输入4【回车】是读取不到该输入值的

但是你不用输入,程序会直接结束,因为前一个输入的回车并没有舍弃,而是在缓冲区,这时读取到的是缓冲区的回车而直接结束。

以下是不使用cin.ignore丢弃缓冲区的字符的结果:

指针光标不跳过回车键:注释掉cin.ignore之后,可以看到程序只输入5【回车】,就直接结束了,而且输入了5个空串,后面的输入语句看似没有执行,其实执行了,读取的是缓冲区中遗留下的回车键,并且cin.get函数遇到回车不会将指针光标移到回车后,故造成了读到的一直是回车,所以结束

cin.getlinecin.get函数类似,所不同的是,cin.getline遇到回车会将指针光标后移,具体看后面cin.getline的贴图。

cin.ignore的作用默认是丢弃缓冲区的一个字符)。

我们可以看到cin>>len之后,回车了,而且后面也有cin.get要求输入,但是程序却直接自动执行结束,说明读取字符串时,指针光标不会跳过回车键,除非人为添加cin.ignore()或者getchar()读走回车键,程序才能正常运行.

int main()
{


    int len=0;
    cin>>len;

    int j=0;
//    cin.ignore();
    while(len)
    {
        cout<<"len:"<<len<<endl;
        char str[100];

        cin.get(str,100);
//        cin.ignore();

        cout<<"str:"<<str<<'\t';
        j++;
        len--;
    }
    return 0;
}

在这里插入图片描述

如下所示,使用cin.ignore将回车符丢弃,程序便能够正常运行。

在这里插入图片描述

cin.getline 的读取字符规则:

  1. 读取字符串:回车键结束

当读到回车键的时候,此次读取结束,会将指针光标移到回车键之后,从而下一次读取的是回车键之后的字符

int main()
{


    int len=0;
    cin>>len;

    int j=0;
    cin.ignore();
    while(len)
    {
        cout<<"len:"<<len<<endl;
        char str[100];

        cin.getline(str,100);
//        cin.ignore();

        cout<<"str:"<<str<<'\t';
        j++;
        len--;
    }
    return 0;
}

当我们输入2【回车】后,使用cin.ignore丢弃了回车符,所以再输入12【回车】时,直接读取12,指针光标移到回车之后,而第二次读取时,读取的是我们输入的23,而不是12的回车键
在这里插入图片描述

如果我们注释掉第一个cin.ignore之后,可以看到,我们输入2【回车】后,len读取了2,然后cin.getline遇到前面缓冲区留下的回车键结束此次读取操作,并将指针光标移动至回车之后,然后执行下一次读取操作,我们输入23,可以看到第二次读取到了23这个字符串。

在这里插入图片描述

  • 82
    点赞
  • 619
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

.obsession.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值