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

无法理解fgets输出:输入字符数为3时仅显示2个字符的问题

问题解决:输入指定长度字符串时显示不全

问题根源

fgets函数的第二个参数指定的是最大可读入的字符总数(包含字符串结束符\0)。当你申请了n个字符的内存空间,并用fgets(string, n, stdin)读取时,最多只能存入n-1个有效字符——最后一个位置必须留给\0来标记字符串结束。这就是输入3个字符时,程序仅显示前2个的原因。

修正方案

需要做两处关键修改:

  • 内存分配时多申请1个字符的空间,专门用来存放\0
  • 调用fgets时,把最大读取数设为n+1,确保能容纳n个有效字符加结束符

修正后的完整代码:

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

int main(void) {

    // 提示用户输入想要输入的字符数
    printf("Enter how many characters you want to write. \n");
    int n;
    int itemsRead = scanf_s("%d", &n);

    if (itemsRead != 1) {
        // scanf未读取到预期输入,处理错误
        printf("Error: Input is not in the expected format.\n");
        return 1; // 返回非零值表示错误
    }
    
    // 清空输入缓冲区
    int c;
    while ((c = getchar()) != '\n' && c != EOF);

    // 多分配1个字节用于存储字符串结束符'\0'
    char *string = NULL;
    string = (char *)malloc((n + 1) * sizeof(char));

    if (string != NULL) {
        printf("Enter the string \n");
        // 最大读取n+1个字符(含'\0'),确保能存下n个有效字符
        fgets(string, n + 1, stdin);
        // 去掉fgets读取的换行符(如果存在)
        string[strcspn(string, "\n")] = '\0';
        printf("string is: %s\n", string);
    }

    free(string);
    string = NULL;
}

额外说明:添加strcspn调用是为了移除fgets可能读取到的换行符(用户输入完字符串按回车时,该换行符会被fgets一并读入),让输出结果更符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 22:05:27