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

如何限制fgets仅接受指定长度输入并处理超长输入?

问题分析与修复方案

原代码存在两个核心问题:

  1. fflush(stdin)是未定义行为:C标准仅规定fflush对输出流有效,用它清空输入缓冲区在不同编译器下行为不一致,无法可靠清除剩余输入。
  2. 超长输入的判断逻辑错误:当输入超过9个字符时,fgets会读取前9个字符(缓冲区大小为10,最后一位留给终止符\0),此时strlen(buffer)等于9,不会触发>9的判断,剩余字符会留在输入缓冲区,导致下一次fgets继续读取,出现拆分输出的情况。

修复后的代码

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

int main() {
    char buffer[10];
    while (1) {
        if (fgets(buffer, 10, stdin) == NULL) {
            // 处理EOF或读取错误
            break;
        }

        // 检查输入是否超长:buffer中没有换行符,说明输入超过了缓冲区可容纳的字符数
        if (!strchr(buffer, '\n')) {
            printf("invalid\n");
            // 清空输入缓冲区:读取所有剩余字符直到换行或EOF
            int c;
            while ((c = getchar()) != '\n' && c != EOF);
            continue;
        }

        // 移除换行符
        buffer[strcspn(buffer, "\n")] = '\0';
        // 处理有效输入
        printf("Input: %s\n", buffer);
    }
    return 0;
}

关键修改说明

  • 替换fflush(stdin):用getchar()循环读取剩余字符,直到遇到换行符或EOF,这是标准C中可靠清空输入缓冲区的方法。
  • 修正超长输入判断:通过strchr(buffer, '\n')检查输入是否包含换行符。如果fgets读取的内容里没有换行符,说明输入的字符数超过了缓冲区可容纳的上限(9个可见字符+1个终止符),判定为超长输入。
  • 调整循环逻辑:确保每次输入处理完成后,要么处理有效输入,要么清空缓冲区后重新等待输入,避免剩余字符干扰下一次读取。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 21:42:51