scanf()函数最容易出问题的地方就是
格式化读取与缓冲区的问题。
结合代码来看:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
   | #include<stdio.h>
  int main() { 	int a=1,b=1; 	char c='a'; 	printf("before:\n");        printf("%d,%d,%c\n",a,b,c);   //输出初始化状态          scanf("%d%d",&a,&b);          //清空缓冲区     //fflush( stdin );     //scanf("%*[^\n]%*c");          scanf("%c",&c);
      printf("%d,%d,%c\n",a,b,c);   //输出之后的变化 }
 
   | 
 
一开始输出1,1,a这没问题。

scanf()从缓冲区格式化读取东西,如果缓冲区不为空,无需等待用户输入,直接从缓冲区继续读取。
当我输入2 b时,结果如下:

分析:
scanf(“%d%d”,&a,&b);
想要读取两个整型数据,先读取到2符合,存到了a;然后读到空格,忽略;(直接输2b结果一样)。在读取b字符型不是整型,退出scanf()函数,b变量并未被赋值。
**此时,缓冲区中剩余字符b。**
   然后执行
scanf(“%c”,&c);
   因为缓冲区中有字符b,直接读取b,存到了c变量。
 
清空缓冲区:
  代码中加入下列两个函数之一都可以清空缓冲区。
fflush( stdin );
scanf(“%[^\n]%c”);
  
  输入2b之后,缓冲区被清,第二个scanf()函数等待用户输入。
 
     
    
    
    
    
        -------------
        Thank you for reading
        -------------