scanf读取字符型的注意事项

发布于 2023-04-11  403 次阅读


问题来源

int main() {
    int i;
    char c;
    scanf("%d",&i);
    printf("i=%d\n",i);//把标准缓冲区中的整型数读走了
    scanf("%c",&c);
    printf("c=%c\n",c);//输出字符变量c
    return 0;
}

输入10,回车后,程序并没有停下来让你继续输入字符,而是输出

i=10
c=

//运行结束

就完了,注意c=下面有一行空的。

这是因为scanf让程序暂停让你输入的原理是判断标准输入缓冲区是否为空,如果是空的就暂停程序,如果不是空的就按照格式(%d,%c这种格式)读走缓冲区的内容。而整型、浮点型、字符串型的读取是会忽略换行符\n、空格等一些字符,直接找后面的内容的,字符型却会把这些也读走,不会忽略。

以上面代码为例,一开始标准输入缓冲区里没有东西,所以暂停程序让我们输入内容,这时候我们输入10,回车,缓冲区里出现10\n,然后%d把10读走,只剩下\n,然后到scanf("%c",&c);的时候,发现缓冲区里还有\n,所以直接读走,所以c=下面出现了一空行。

解决办法为在scanf("%c",&c);前面加一行fflush(stdin);表示清空缓冲区里的内容,问题就解决了

在连续输入的情况下也会出现类似情况,比如scanf("%d%c%f",&d,&c,&f);输入10空格的时候%c就把空格读走了,这时候程序会警告这个语句只读到两个数据,解决办法是在%c前面加一个空格。

届ける言葉を今は育ててる
最后更新于 2023-04-11