详解cin输入的空格问题,cin.get与cin.getline函数的关联与区别

出现的问题

        当我们平常使用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( )来删除上一次的错误输入。

        有用的话点个赞再走吧(⊙﹏⊙)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Mishudo_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值