C语言scanf函数处理机制及getchar机制

来源:互联网 发布:ipad怎么开淘宝网店 编辑:程序博客网 时间:2024/06/07 13:47

函数 scanf() 是从标准输入流stdio (标准输入设备,一般指向键盘)中读内容的通用子程序,可以说明的格式读入多个字符,并保存在对应地址的变量中。
其调用格式为: scanf(“<格式化字符串>”,<地址表>);
scanf()函数返回成功赋值的数据项数,出错时则返回EOF。
格式字符串包括三种字符“格式化符“,如”%d,%c,%s”等;”空白符”,如空格,制表符,新行符;”非空白符”,如”,”等。
空白符:空白字符会使scanf函数在读操作中略去输入中的一个或多个空白字符。
非空白符:一个非空白字符会使scanf()函数在读入时剔除掉与这个非空白字符相同的字符。

如:scanf(“%d%d”,&a,&b);
  或scanf(“%d %d”,&a,&b); 输入时: 1 2
  scanf(“%d,%d”,&a,&b); 输入时:1,2

关键:在用格式化符%c时,空格,转义符均为有效字符;
 例:scanf(“%c%c%c”,&a,&b,&c);
 输入:a□b□c
 则:a=’a’,b=’□’,c=’b’
实际遇到的问题:

int main()  4 {  5     char a,b;  6     scanf("%c",&a);  7     scanf("%c",&b);  8     printf("%c %c",a,b);  9     return 0; 10 }

gdb调试:

6       scanf("%c",&a);(gdb) na7       scanf("%c",&b);(gdb) n8       printf("%c %c",a,b);(gdb) p a$1 = 97 'a'(gdb) p b$2 = 10 '\n'

当输入完a的值后,回车也被b接受,在实际运行输入完a就直接打印a结束。
优化:

int main()  4 {  5     char a,b;  6     scanf("%c",&a);  7     getchar();  8     scanf("%c",&b);  9     printf("%c  %c",a,b); 10     return 0; 11 }

在scanf前加上getchar();

6       scanf("%c",&a);(gdb) na7       getchar();(gdb) n8       scanf("%c",&b);(gdb) b9       printf("%c  %c",a,b);(gdb) n10      return 0;(gdb) p a$1 = 97 'a'(gdb) p b$2 = 98 'b'

百度百科getchar机制:
 当程序调用getchar时.程序就等着用户按键。用户输入的字符被存放在键盘缓冲区中。直到用户按回车为止(回车字符也放在缓冲区中)。当用户键入回车之后,getchar才开始从stdio流中每次读入一个字符。如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取。也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键。

fflush(stdin)函数:对于上面情况处理无效,还没能搞懂,此处保留。

原创粉丝点击