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

C语言多输入异常:无法正常获取第三个输入内容

问题原因

你的代码出现跳过第三项输入的问题,核心是输入缓冲区里残留的换行符在捣乱:

  1. 输入第一个字符后按下回车,这个\n会留在输入缓冲区中。
  2. 第二个scanf("%s", s)会自动跳过空白字符(包括换行),所以能正常读取单词,但读完单词后,输入单词后的回车又会留在缓冲区。
  3. 第三个scanf("%[^\n]%*c", sen)要求读取所有非换行的字符,但此时缓冲区第一个字符就是\n,导致匹配失败,直接跳过输入步骤,sen的内容未被正确赋值。
解决方法

方法一:修改scanf格式串,自动跳过空白

在%c和%[^\n]前添加空格,让scanf自动跳过所有空白字符(换行、空格、制表符),就能完美解决缓冲区残留问题:

#include <stdio.h>
#include <string.h>

int main() 
{
    char ch;
    char s[100];
    char sen[100];

    // 空格跳过所有空白,确保读取到有效字符
    scanf(" %c", &ch);
    // %s自动跳过空白,读取连续非空白字符(单词)
    scanf("%s", s);
    // 空格跳过单词后的换行,%[^\n]读取整句,%*c吃掉末尾换行
    scanf(" %99[^\n]%*c", sen); // 加99限制读取长度,避免缓冲区溢出

    printf("%c", ch);
    printf("\n%s", s);
    printf("\n%s", sen);
    
    return 0;
}

说明:

  • %99[^\n]限制最多读取99个字符,给字符串结束符\0留位置,避免数组溢出。
  • %*c会读取最后的换行符但不存储,防止它留在缓冲区影响后续操作。

方法二:手动清空缓冲区残留字符

如果不想修改格式串,可以在每次输入后用getchar()吃掉残留的换行符:

#include <stdio.h>
#include <string.h>

int main() 
{
    char ch;
    char s[100];
    char sen[100];

    scanf("%c", &ch);
    getchar(); // 吃掉输入字符后的回车
    scanf("%s", s);
    getchar(); // 吃掉输入单词后的回车
    scanf("%99[^\n]%*c", sen);

    printf("%c", ch);
    printf("\n%s", s);
    printf("\n%s", sen);
    
    return 0;
}

注意:这种方法只适合每次残留一个换行的情况,如果输入时存在多个空白字符,建议用方法一。

关于fgets的正确用法

gets函数已被C标准废弃(存在严重缓冲区溢出风险),绝对不要使用。如果想用fgets实现需求,需要处理它会读取换行符到字符串的问题:

#include <stdio.h>
#include <string.h>

int main() 
{
    char ch;
    char s[100];
    char sen[100];

    scanf("%c", &ch);
    getchar(); // 吃掉字符后的回车

    // 读取单词,用strcspn去掉末尾换行
    fgets(s, sizeof(s), stdin);
    s[strcspn(s, "\n")] = '\0';

    // 读取整句,同样去掉换行
    fgets(sen, sizeof(sen), stdin);
    sen[strcspn(sen, "\n")] = '\0';

    printf("%c", ch);
    printf("\n%s", s);
    printf("\n%s", sen);
    
    return 0;
}

说明:strcspn(s, "\n")会返回字符串中第一个换行符的位置,把这个位置设为\0就能去掉fgets读取的换行符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 19:43:03