这个东西真的对于C的初学者来说会困扰很长时间(其实就是我啦)!今天我就来KO掉这个小困惑
getchar()
从缓冲区读走一个字符,相当于就是清除缓冲区,比如我就喜欢时不时的用它来“吃掉”回车,可谓是我的宠儿,BUT问题来了今天OJ上刷题时它开始调皮了(是我太菜)getchar()“吃”了它不该“吃”的!
那我们就来看一个简单的例子吧!————错误示范

运行结果:

正确示范

运行结果:

对比
- gets()中夹着getchar()的时候输出不符合常理
- 字符串的长度异常
思考
- 是getchar()的错误使用导致当前这种状况
- gets()与getchar()的使用方法
- 背景:缓冲区:是内存,可以自定义缓冲区的大小;当数据在程序(内存)与其他设备间传输时(如硬盘);如果没有缓冲区,每次只能写入一个字节效率很低;有了缓冲区我们可以将要写入硬盘的数据暂存在内存中,当数据达到一定长度,一次性的写入,提高读写效率。输入——缓冲区——硬盘
分析
getchar ():当按下回车的时候,getchar()进入缓冲区读取字符串,但是仅仅将第一个字符作为返回值,吃掉回车的原理就是仅仅按下了回车那么读入的也只是回车(如果没有用变量对其进行一个储存就相当于清除)。
注意getchar()的返回值为输入字符的ASCLL码
案例:


在这里是由于b吞掉了一个回车,所以a里面装的是'w'的ascll码,b里面装的是'enter'的ascll码,显而易见那么变量c里面装的就是'q'的ascll码,这也是为什么输出时会有换行效果的原因。
总结:回到我们的前面的疑问(为什么字符串数少了一位)?
是因为getchar它吞掉我们的第二个字符串的第一个字符。
那么现在我们再来看看gets()又是怎么一回事!
gets()
gets()函数从标准输入设备读入一行数据,遇到回车就会返回,但是gets()并不会读取换行符'\n',而是将'\0'作为字符串结束的标志,'\n'被舍弃不会留在缓冲区。
scanf()函数!!!
scanf()
函数以空格或回车符做结束读取标志,空格和回车符会留在缓冲区。
因此我们在使用scanf()函数的时候就会遇到两大问题
第一:不能直接输入空格;
第二:遗留的回车符会对后面的读取造成影响;
KO:第一个问题:
我们可以这样使用scanf("%[^\n]",str1);//表示除了\n其他的字符都可接收,那么我们就可以用它来接收我们的空格啦!
案例:

KO:第二个问题:
当我们前面用过scanf()后就会在缓冲区遗留一个回车,那么如果我们在后面再使用scanf()函数来读取字符串那么后者就会将前面的回车给读走,造成一些问题。
案例:

那么我们的解决方法就是在两者之间加入一个getchar()或是fflush(stdin)刷新缓冲区。
getchar:
希望对您有帮助!!!