getchar()、gets()和scanf()

这个东西真的对于C的初学者来说会困扰很长时间(其实就是我啦)!今天我就来KO掉这个小困惑

getchar()

从缓冲区读走一个字符,相当于就是清除缓冲区,比如我就喜欢时不时的用它来“吃掉”回车,可谓是我的宠儿,BUT问题来了今天OJ上刷题时它开始调皮了(是我太菜)getchar()“吃”了它不该“吃”的!

那我们就来看一个简单的例子吧!————错误示范

 

运行结果:

 正确示范

 

运行结果:


对比

  • gets()中夹着getchar()的时候输出不符合常理
  • 字符串的长度异常

思考

  • 是getchar()的错误使用导致当前这种状况
  • gets()与getchar()的使用方法
  • 背景:缓冲区:是内存,可以自定义缓冲区的大小;当数据在程序(内存)与其他设备间传输时(如硬盘);如果没有缓冲区,每次只能写入一个字节效率很低;有了缓冲区我们可以将要写入硬盘的数据暂存在内存中,当数据达到一定长度,一次性的写入,提高读写效率。输入——缓冲区——硬盘

分析

getchar ():当按下回车的时候,getchar()进入缓冲区读取字符串,但是仅仅将第一个字符作为返回值,吃掉回车的原理就是仅仅按下了回车那么读入的也只是回车(如果没有用变量对其进行一个储存就相当于清除)。                    

注意getchar()的返回值为输入字符的ASCLL码

案例:

getchar()吞回车运行结果

在这里是由于b吞掉了一个回车,所以a里面装的是'w'的ascll码,b里面装的是'enter'的ascll码,显而易见那么变量c里面装的就是'q'的ascll码,这也是为什么输出时会有换行效果的原因。

总结:回到我们的前面的疑问(为什么字符串数少了一位)?

是因为getchar它吞掉我们的第二个字符串的第一个字符。

那么现在我们再来看看gets()又是怎么一回事!

gets()

gets()函数从标准输入设备读入一行数据,遇到回车就会返回,但是gets()并不会读取换行符'\n',而是将'\0'作为字符串结束的标志,'\n'被舍弃不会留在缓冲区

但是它也有缺点,它不能够检查当前数组是否能够装的下我们的字符串,会导致缓冲区溢出,我们可以用fgets()函数来替代这个gets()函数。

scanf()函数!!!

 

 scanf()

函数以空格或回车符做结束读取标志,空格和回车符会留在缓冲区。

因此我们在使用scanf()函数的时候就会遇到两大问题

第一:不能直接输入空格;

第二:遗留的回车符会对后面的读取造成影响;

KO:第一个问题:

我们可以这样使用scanf("%[^\n]",str1);//表示除了\n其他的字符都可接收,那么我们就可以用它来接收我们的空格啦!

案例:

scanf的应用

KO:第二个问题:

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

案例:

那么我们的解决方法就是在两者之间加入一个getchar()或是fflush(stdin)刷新缓冲区。

getchar:

希望对您有帮助!!!


版权声明:本文为qq_46258465原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。