简要概括 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  ,这样就不用纠结在缓冲区问题上了。

   

时间: 2024-08-29 11:54:37

简要概括 getchar() 与 scanf() 的异同的相关文章

getchar() 和 scanf("%c")的区别

getchar()和scanf("%c")的功能都是从STDIN读一个字符,单论功能两者没有区别. 但两者的返回值是有区别的: ------------------------------------------------ scanf()的详尽介绍请移步这里. ------------------------------------------------- scanf()的返回值的含义是: On success, the function returns the number of

cin与getchar、scanf之间的区别

cin会忽略空格和回车 getchar与scanf不会忽略回车和空格 // exam1.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using namespace std; int main(void) { char ch; ch=getchar(); printf("%d\n",ch); cin>>ch; printf("%d\n",ch

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

C语言中基本的输入输出函数有: putchar ():把变量中的一个字符常量输出到显示器屏幕上; getchar ();从键盘上输入一个字符常量,此常量就是该函数的值; printf ();把键盘中的各类数据,加以格式控制输出到显示器屏幕上; scanf ();从键盘上输入各类数据,并存放到程序变量中; puts ():把数组变量中的一个字符串常量输出到显示器屏幕上; gets ():从键盘上输入一个字符串常量并放到程序的数组中. sscanf(); 从一个字符串中提取各类数据.  putcha

getchar与scanf区别

scanf可以一次按照设定的输入格式输入多个变量数据.如int d,float f,char str[20],scanf("%d%f%s",d,f,str); getchar()只能输入字符型,输入时遇到回车键才从缓冲区依次提取字符. 如char ch;ch=getchar();输入abc\r(回车)ch=a;用在循环时也要等有回车键时才接收. char ch;while((ch=getchar())!='q'){printf("%c ",ch);

getchar(),gets(),scanf()的差异比较

scanf( )函数和gets( )函数都可用于输入字符串,但在功能上有区别.若想从键盘上输入字符串"hi hello",则应该使用gets()函数. gets可以接收空格:而scanf遇到空格.回车和Tab键都会认为输入结束,所有它不能接收空格. char string[15]; gets(string); /*遇到回车认为输入结束,并且回车键用‘\0’代替*/ scanf("%s",string); /*遇到空格认为输入结束*/ 所以在输入的字符串中包含空格时,

【JAVA I/O】字符输出流Writer简要概括

偷个懒,直接参考上篇字符输入流Reader的形式,其实Reader和Writer本来就大同小异: 字符输出流Writer 本篇将对JAVA I/O流中的字符输出流Writer做个简单的概括: 总得来说,每个字符输出流类都有一个对应的用途,如下: 字符输出流基类:Writer 字节流转字符流:OutputStreamWriter              //往字节输出流中写字符 字符文件写入相关:FileWriter                          //往文件中写字符 字符数组

C Language Study - gets , getchar &amp;amp; scanf

慢慢的发现C语言功底是如此的薄弱,被这几个字符输入函数搞糊涂了又~~ 来,再来忧伤一次吧~ 那么.我们从scanf開始: 假如说你要将一串字符输入到一字符数组里,例如以下面程序, char a[2]; char b[3]; scanf("%s%s",a,b); printf("%s\n%s",a,b); scanf使用%s接收字符串.可是并非每个输入的字符都会被当做字符串处理.空格.tab.换行.都会被残忍的拒绝,因此输入一串"带有空格的字符串"

c#简要概括面向对象的三大特征

要去面试了,朋友给我出个问题: 一,封装: 我们可以把世界上任何一个东西都看作为一个对象,那么我们这里以人为例,一个人就肯定是一个对象了. 那么封装是什么呢?封装就是这个人要完成一件事情,他所需要的任何工具都带在了自己的身上,所需要的技术也都装在了自己的脑子里了.不需要借助于别人的力量就能完成这一件事情.这个有什么好处呢?好处就是如果我要吩咐这个人去完成一件事情,我不需要知道他是怎么完成的,也不需要协助他去完成,只要知道结果,他完成了就OK了.至于他是先干什么后干什么我不干涉,这有助于他更快更好

浅谈C语言中scanf(),gets(),getchar()函数区别与联系

众所周知,scanf函数和gets函数是从键盘输入数据的函数.其基本函数功能这里不做过多赘述,只对两个函数易错点深入分析. int main() { char a[20]; char b[20]; char c[20]; printf("请输入a字符串\n"); scanf("%s",&a); printf("请输入b字符串\n"); gets(b); printf("请输入c字符串\n"); gets(c); ret