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

C语言char数组用fgets读取带空格输入程序崩溃如何解决

问题排查与修复方案

崩溃原因

  • 原代码中char *ch[2]是长度为2的字符指针数组,声明后两个指针均为未初始化的野指针,没有指向合法的可写内存空间。直接调用fgets往野指针指向的地址写入输入内容,会触发非法内存访问,直接导致程序崩溃。
  • 你后续尝试的修改逻辑也存在错误:单独声明char ch[20]和char ch[100]属于同名变量重定义,编译阶段就会报错,无法正常生成可执行程序。

最优实现方案

方案1:栈上分配二维字符数组(推荐,无需手动管理内存)

适合固定长度的输入场景,代码简单无内存泄漏风险:

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

int main() {
    // 声明二维数组,第一维存2个字符串,第二维统一开100长度适配两类输入
    char ch[2][100];

    printf("输入姓名:");
    fgets(ch[0], 20, stdin);
    // 可选:去掉fgets读取的末尾换行符
    ch[0][strcspn(ch[0], "\n")] = '\0';

    printf("输入文本:");
    fgets(ch[1], 100, stdin);
    ch[1][strcspn(ch[1], "\n")] = '\0';

    // 测试输出验证读取结果
    printf("读取的姓名:%s\n", ch[0]);
    printf("读取的文本:%s\n", ch[1]);
    return 0;
}

方案2:动态内存分配(适合需要动态调整缓冲区大小的场景)

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

int main() {
    char *ch[2];
    // 分别为两个指针分配对应长度的内存空间
    ch[0] = (char *)malloc(20 * sizeof(char));
    ch[1] = (char *)malloc(100 * sizeof(char));
    if (ch[0] == NULL || ch[1] == NULL) {
        printf("内存分配失败\n");
        return 1;
    }

    printf("输入姓名:");
    fgets(ch[0], 20, stdin);
    ch[0][strcspn(ch[0], "\n")] = '\0';

    printf("输入文本:");
    fgets(ch[1], 100, stdin);
    ch[1][strcspn(ch[1], "\n")] = '\0';

    printf("读取的姓名:%s\n", ch[0]);
    printf("读取的文本:%s\n", ch[1]);

    // 释放动态申请的内存避免泄漏
    free(ch[0]);
    free(ch[1]);
    return 0;
}

注意事项

fgets会将输入末尾的换行符\n一并读取到缓冲区中,如果不需要保留换行符,可以用strcspn函数定位到换行符位置并替换为字符串结束符\0。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 23:06:03