在笔者学习编程的过程中经常会遇见需要连续输入几个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)
你用输入法打一个“ 吴谦 ”,他不会认为你这是两个字符,相反只会取前两个字符并能将其对应为汉字输出,最后你会看到输出的是 “吴”。
总结:系统根据缓冲区内的数据依次同当前程序所执行语句进行判断,从而判断两组/两种数据之间的输入间隔,从而完成内容的分配。
希望这篇小心得可以帮得到大家,如有错误请批评指正(毕竟我也是初学者。。。)