You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

scanf()输出异常:整数与字符输入代码单独正常,联合运行失败

整数与字符混合输入时scanf的缓冲区问题解决

问题重现

你的代码单独读取整数或字符都正常,但混合使用时,第一个字符输入会读取到换行符,导致预期的m无法输出:

#include<stdio.h>
int main() {
    int base;
    char num1,num2,num3,num4;

    scanf("%i",&base);
    printf("%i\n",base);

    scanf("%c",&num1);
    scanf("%c",&num2);
    scanf("%c",&num3);
    scanf("%c",&num4);

    printf("%c",num1);

    return 0;
}

输入:

8
m n o p

预期输出:

8
m

实际输出:

8

问题原因

当你输入8并按下回车时,scanf("%i", &base)只读取了整数8,但回车产生的换行符\n会留在输入缓冲区中。后续第一个scanf("%c", &num1)会直接读取这个换行符,而不是你输入的m。打印num1时输出的是换行,所以看起来没有打印m。

解决方法

方法1:在%c前添加空格跳过空白字符

scanf的格式串中,空格会匹配任意数量的空白字符(包括换行、空格、制表符),可以自动跳过缓冲区里的残留换行:

#include<stdio.h>
int main() {
    int base;
    char num1,num2,num3,num4;

    scanf("%i",&base);
    printf("%i\n",base);

    // %c前加空格,跳过缓冲区中的空白字符
    scanf(" %c",&num1);
    scanf(" %c",&num2);
    scanf(" %c",&num3);
    scanf(" %c",&num4);

    printf("%c",num1);

    return 0;
}

方法2:读取整数后手动清除缓冲区的换行符

用getchar()读取并丢弃缓冲区里的换行符:

#include<stdio.h>
int main() {
    int base;
    char num1,num2,num3,num4;

    scanf("%i",&base);
    printf("%i\n",base);

    // 吃掉缓冲区中残留的换行符
    getchar();

    scanf("%c",&num1);
    scanf("%c",&num2);
    scanf("%c",&num3);
    scanf("%c",&num4);

    printf("%c",num1);

    return 0;
}

注意:不推荐使用fflush(stdin)

虽然很多编译器支持fflush(stdin)清空输入缓冲区,但这属于C标准未定义的行为,跨平台使用可能出现问题,因此优先选择前两种方法。

内容的提问来源于stack exchange,提问作者Lazy_head

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 06:57:08