scanf()函数原理


一、三点说明

1、用户输入的字符,会以ASCII码形式存储在键盘缓冲区;
2、每调用一次scanf函数,就从键盘缓冲区读走一个字符,相当于清除缓冲区;
3、若用户一次输入n个字符,则前n次调用scanf函数都不需要用户再次输入,直到把缓冲区的数据全部读取(清除)干净

4、调用scanf()函数时,用户最后输入的回车也会储存在键盘缓冲区;(见程序示例2)

二、程序示例1

 1 # include <stdio.h>
 2 
 3 int main()  4 {  5     char ch;  6     while (1)  7  {  8         scanf("%c", &ch);  9 
10         switch(ch) 11  { 12             case '1': 13                 printf("haha\n"); 14                 break; 15             case '2': 16                 printf("cccccc\n"); 17 // fflush(stdin); //清除缓冲区
18                 break; 19             case '3': 20                 printf("555\n"); 21                 break; 22             case 'e': 23                 return 0; 24             default: 25                 return 0; 26  } 27  } 28 
29     
30 
31     return 0; 32 } 33 
34 /*
35 程序在VC++6.0中的显示结果是: 36 1235r 37 haha 38 cccccc 39 555

程序示例2

 1 # include <stdio.h>
 2 
 3 int main()
 4 {
 5     char c;
 6     scanf("%c", &c);
 7     printf("%d\n", c);
 8 
 9     scanf("%c", &c);
10     printf("%d\n", c);
11     
12     return 0;
13 }
14 
15 /*
16 程序在VC++6.0中的显示结果是:
17 1
18 49
19 10
20 */

上例中因为1对应的ASCII码是49,回车键对应的ASCII码是10,故有以上输出;

第二个scanf从缓冲区读入了“回车”,显然这是我们不愿要的,如果要想清除这个垃圾值,只需要在第8行添加语句fflush(stdin)

程序示例3

 1 #include <stdio.h>
 2 #include <conio.h>
 3 
 4 void main( void )
 5 {
 6    int integer;
 7    char string[81];
 8 
 9    /* Read each word as a string. */
10    printf( "Enter a sentence of four words with scanf: " );
11    for( integer = 0; integer < 4; integer++ )
12    {
13       scanf( "%s", string );
14       printf( "%s\n", string );
15    }
16 
17    /* You must flush the input buffer before using gets. */
18    fflush( stdin );
19    printf( "Enter the same sentence with gets: " );
20    gets( string );
21    printf( "%s\n", string );
22 }

 

三、清除缓冲区的几种方法

我们使用多个scanf()的时候,如果输入缓冲区还有数据的话,那么scanf()就不会询问用户输入,而是直接就将输入缓冲区的内容拿出来用了,这就导致了前面的错误影响到后面的内容,为了隔离这种问题,需要通过各种方法将输入缓冲区的内容读出来(清除)

1、fflush(stdin)

在程序17行如果插入代码,依然输入1235r,则输出为 haha  cccccc

此种方法对vc可以,但对xcode和linux不适用

2、while+getchar

 while (ch=getchar() != '\n' && ch != 'EOF'),直到读取到缓冲区的换行或者空值

四、关于scanf函数接受键盘的细节

程序示例1

 1 #include <stdio.h>
 2 
 3 int main() 
 4 {    
 5    int a = 0, b =0;
 6    char d = 'a', e ='a';
 7    scanf("%d",&a);        //输入字符a到缓存,跳过接受,a=0
 8    scanf("%d",&b);        //输入字符a到缓存,跳过接受,b=0
 9    scanf("%c",&d);        //输入字符a到缓存,接受,d=a
10    scanf("%c",&e);        //e接受换行符,ASCII为10
11    printf("%d,%d,%c,%d\n",a,b,d,e);
12    return 0;
13 }
14 
15 /*
16 程序在VC++6.0中的显示结果是:
17 a
18 0,0,a,10
19 */

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM