简要概括 getchar() 与 scanf() 的异同

Posted 大峰子的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简要概括 getchar() 与 scanf() 的异同相关的知识,希望对你有一定的参考价值。

C中的缓冲区一直是debug的重灾区,今天在写一个命令行界面的时候又遇到了这个问题,所以来总结一波。

 


 

不同:

  scanf() 会把 stdin 中的特定格式数据取出,非特定格式数据则会留在stdinBuff 中,比如 while(){ scanf("%c", ); } ,当你输入一个字符串+ 回车的时候,它会把按char类型取出每个字符,然后在把最后一个输入的 \n 留在stdinBuff 中;当你输入一个字符+回车,多次输入的时候,它会把每次输入中的\n都留在 stdinBuff 中。

  getchar() 会把 stdin 中的第一个字符取出,而把输入的其余数据放入 stdBuf 中。

相同:

  当stdinBuff中有数据存在时,优先从 stdinBuff 中读取数据,当 stdinBuff 中无数据时,才从stdin 中读取数据。

那么如何清理 stdinBuff中的残余数据呢?

  推荐使用 1、getchar() 去吸收残余数据。

  别的方法如下:  

  2、Windows下有C库函数 fflush(stdin) ,但是要注意这个函数很依赖编译器。

  3、由于LInux无法用 fflush(stdin) 刷新stdin的缓冲区,所以可利用 setbuf(stdin, NULL) 置 stdin 的 Buffer 为NULL以达到刷新 stdinBuffer 的目的,但是这样也会带来一个问题:pointer of stdinBuffer 指向了NULL,相当于stdin的缓冲区不存在了,这不是我们想要的目的,虽然可以清楚当前 stdinBuffer 的数据,但是以后读数据都必须 从 istream(类型为FILE *) 中读取,有点儿大财小用的意味,所以并不推荐用 setbuf() 去“刷新”缓冲区。

那么如何清理 stoutBuff 中的残余数据呢?

  C库函数 printf( "\n") 。

 

额外说一句,如果在C++中, cin.get() 可以只读入一个字符而避免读入 \n  ,这样就不用纠结在缓冲区问题上了。

   





以上是关于简要概括 getchar() 与 scanf() 的异同的主要内容,如果未能解决你的问题,请参考以下文章

scanf与getchar()区别

scanf与getchar()区别

scanf输入与getchar的比较

输出与输出:putchar() getchar() printf() scanf() puts() gets() sscanf()

喵呜 来啦来啦:C语言gets(),scanf()与getchar()函数的区别

scanf() gets() getchar()