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

为何我的C程序无法输入变量b?输入流程异常求助

问题:scanf输入整数后,gets被跳过无法输入字符串变量

问题描述

想要输入int类型变量a和字符串变量b,但运行程序时,输入a的数值后,程序直接跳过b的输入提示和gets()调用,最终输出中b为空。

原代码

#include<stdio.h>
int main()
{
    int a;
    char b[5];
    printf("Write a:\n");
    scanf("%i", &a);
    printf("Write b:\n");
    gets(b);
    printf("a = %i, b = %s", a, b);
    return 0;
}

(注:原代码中#include<stdio>>是笔误,正确应为#include<stdio.h>)

程序输出

a = (输入的数值), b =

问题原因

scanf("%i", &a)读取整数时,只会读取输入中的数字部分,当你输入完数字按回车后,这个回车对应的换行符\n会留在输入缓冲区中。而gets()函数的行为是从缓冲区读取内容,直到遇到换行符就停止读取,所以它会直接把这个残留的换行符当成输入,导致b被赋值为空字符串,看起来像是跳过了输入步骤。

另外要注意:gets()是C标准已经废弃的不安全函数,它不检查输入长度,一旦输入超过数组b的大小,会导致缓冲区溢出,引发程序崩溃或安全问题。

解决方法

方法1:处理缓冲区残留换行符,改用安全的fgets

#include<stdio.h>
#include<string.h> // 需要strcspn函数的头文件

int main()
{
    int a;
    char b[5];
    printf("Write a:\n");
    scanf("%i", &a);
    getchar(); // 吃掉输入a后残留的换行符
    printf("Write b:\n");
    fgets(b, sizeof(b), stdin); // 替代gets,指定读取长度避免溢出
    b[strcspn(b, "\n")] = '\0'; // 去掉fgets读取到的换行符
    printf("a = %i, b = %s", a, b);
    return 0;
}

说明:strcspn(b, "\n")会返回字符串b中第一个换行符的位置,将该位置替换为字符串结束符\0,避免输出时带多余换行。

方法2:直接用scanf读取字符串(适合无空格的输入)

#include<stdio.h>

int main()
{
    int a;
    char b[5];
    printf("Write a:\n");
    scanf("%i", &a);
    printf("Write b:\n");
    scanf("%4s", b); // %4s限制最多读4个字符,留1位存'\0'
    printf("a = %i, b = %s", a, b);
    return 0;
}

说明:scanf("%s")会自动跳过前面的空白字符(包括换行符),所以不需要额外处理缓冲区,但它会在遇到空格、换行时停止读取,无法输入带空格的字符串。

关键注意点

  • 禁止使用gets(),优先用fgets()替代,确保输入不会溢出数组。
  • 用fgets()时必须处理读取到的换行符,否则会影响后续输出或逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 00:10:36