0%

scanf函数

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 -------------

Title - Artist
0:00