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

如何用C语言获取用户输入填充矩阵?遇段错误求修复

修复段错误及输入逻辑问题

你的代码出现段错误主要是输入处理逻辑混乱导致的,以下是具体问题和修复方案:

核心问题分析

  • 非法的scanf调用:scanf("%c", temp);是严重错误,%c格式需要传入单个char的地址,但你直接传入数组名temp,这不仅逻辑上多余,还可能导致内存写入越界,触发段错误。
  • 冗余的getchar():开头的getchar()会吃掉用户输入的第一个字符,导致scanf读取行列数时得到错误的值,进而创建大小非法的变长数组(比如i为随机大值),造成栈溢出。
  • 输入缓冲区处理错误:循环内的getchar()会意外吃掉用户输入的字符,配合fgets的参数设置不当,导致读取的内容不符合预期,甚至越界。

修复后的代码

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

int main(void) {
    int rows, cols;

    // 读取矩阵行列数,确保输入有效
    if (scanf("%d %d", &rows, &cols) != 2 || rows <= 0 || cols <= 0) {
        printf("输入无效,请输入正整数的行列数\n");
        return 1;
    }

    // 跳过scanf留下的换行符
    while (getchar() != '\n');

    char matrix[rows][cols];

    for (int a = 0; a < rows; a++) {
        // 临时缓冲区要多留一个位置存字符串结束符
        char temp[cols + 1];
        memset(temp, 0, sizeof(temp));

        // 读取一行输入
        if (fgets(temp, sizeof(temp), stdin) == NULL) {
            printf("读取输入失败\n");
            return 1;
        }

        // 去掉换行符(如果存在)
        temp[strcspn(temp, "\n")] = '\0';

        // 将读取的字符填充到矩阵,确保不超过列数
        for (int b = 0; b < cols; b++) {
            // 如果输入的字符不足,用空格填充(可选,根据需求调整)
            matrix[a][b] = temp[b] ? temp[b] : ' ';
        }
    }

    // 测试:打印矩阵
    printf("输入的矩阵:\n");
    for (int a = 0; a < rows; a++) {
        for (int b = 0; b < cols; b++) {
            printf("%c ", matrix[a][b]);
        }
        printf("\n");
    }

    return 0;
}

关键修改点说明

  1. 移除冗余getchar():开头的getchar()会破坏行列数的读取,直接删除。
  2. 添加输入有效性检查:确保行列数是正整数,避免创建非法大小的数组。
  3. 修正临时缓冲区大小:temp设为cols+1,给fgets的字符串结束符留足空间,避免越界。
  4. 处理换行符:用strcspn去掉fgets读取到的换行符,避免矩阵中包含不必要的换行字符。
  5. 删除错误的scanf调用:彻底移除scanf("%c", temp);,这行代码完全不符合逻辑且会导致内存问题。
  6. 跳过换行符的正确方式:在读取行列数后,用while (getchar() != '\n');清空输入缓冲区的剩余内容,避免影响后续fgets的读取。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 13:10:56