使用scanf,cin,gets,getline读入数据的几点心得

       在笔者学习编程的过程中经常会遇见需要连续输入几个int型,char型数据的情况,但是不可避免的会遇见某些数据没有读入到相应位置的情况/相应的空间所接收到的读入数据和自己预想的不一样?欲知问题在哪,给个赞鼓励一下第一次发博客的我再继续往下看好吗?

       在我这个初学者开始step by step 学习编程的过程中,刚开始并没有刻意关注在程序运行过程中输入数据的规范,比如我输入一个数,下一步摁空格还是回车表示结束?或者说为什么空格/回车就表示该次数据读入的结束?emmm……

      先看几个例子:

       我想读入:asd     2       zxc  

        每次输入都摁一下回车,结果却是这样

 

      当我们  cin>>  int  >> int   这一过程时,读入第一个数据后摁空格或回车然后进入第二个数据的输入过程。没问题,对吧?

       同时我们可以考虑:gets(a);  gets(b);   这一连续的过程时,输入第一字符串后摁回车(不能以空格作为分割,因为空格也算字符,并不是gets结束的标志)然后进入下一个字符串输入过程,也没有问题,对吧?

虽然,但是,然而,可是。

当我们实行

    gets(a);

    cin>>n;

    gets(b);

的这一过程时,依然保持输入一个数据就摁一下回车表示结束当前读入   的这一做法时,问题就来了,见上图。

问题本质是  连续输入过程中  系统对于缓冲区内  数据分配匹配  的问题。

也就是说你怎么让系统明白那一部分是哪一部分的问题,即输入的间隔问题。

正文来了。。。。

首先,gets结束标志是读到了  回车  ;

以代码执行过程为例

内部具体实现过程如下。

当我输入asd(\r)时,程序运行到gets,自然系统根据它的所需类型判断缓冲区内的数据,从前往后每一个均为char型直到(\r),则将这一串(包含\r)赋值给a字符数组;

在他的基础上,我再输入  234(\r)时问题就来了。上一步骤中gets已经执行完毕,现在执行cin>>n;则系统从缓冲区判断:2.3.4均为int型,当读到\r时,这时不是int型元素了,表示之前读到的那一串数据为n的值,即cin>>n;结束,系统执行下一语句gets(b);而当前读到的\r是字符型,并且恰好这一字符就是get的结束标志,故gets结束。

整体输入如下:asd(\r)234(\r)

此时a的内容为:asd(\r)     b的内容为(\r)

这也就是为什么输出是那样的结果。

既然知道了b为何没有值,那当我们换一种输入方式:

asd(\r)2zxc(\r)

结果:

 

可以联想前面所说的过程;得到

a的内容:asd(\r)     n的值:2     b的内容:zxc(\r)

所以说当我们连续使用不同数据类型的读入的时候,要注意一下输入数据的格式,回车键不可乱嗯,嗯?

更新:getline不会考虑你现在是中文输入法还是怎么滴,cin.getlline(name,3)

你用输入法打一个“ 吴谦 ”,他不会认为你这是两个字符,相反只会取前两个字符并能将其对应为汉字输出,最后你会看到输出的是   “吴”。

总结:系统根据缓冲区内的数据依次同当前程序所执行语句进行判断,从而判断两组/两种数据之间的输入间隔,从而完成内容的分配。

希望这篇小心得可以帮得到大家,如有错误请批评指正(毕竟我也是初学者。。。)

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值