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

如何在C语言中读取非均匀维度矩阵文本并存储为二维数组?

解决C语言读取不规则行数文本到固定二维数组的问题

问题原因

你的代码中fscanf("%d", &a[i][j])会忽略所有空白字符(包括空格、换行、制表符等),它不会识别文本中的行边界,只会连续读取文件中的整数。这就导致当某一行的数字数量不足COLS时,它会直接读取下一行的数字来填充当前行的剩余列,最终出现你看到的跨行合并的结果。

解决方案

C语言完全可以实现你的需求,核心是要识别文本中的行边界,确保每行的数字只填充到对应行的数组元素中。下面提供两种可行的实现方式:

方式一:逐行读取并解析(推荐)

先通过fgets读取整行文本,再从每行中解析出整数,填充到对应行的数组中,未填满的列保持初始化的0。

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

#define ROWS 3
#define COLS 8 
#define MAX_LINE_LENGTH 100  // 根据实际情况调整每行最大长度

int main() 
{ 
    int a[ROWS][COLS] = {0}; 
    int i, j; 
    FILE *in = fopen("data.txt", "r"); 
    
    // 检查文件是否成功打开
    if (!in) {
        perror("无法打开文件");
        return 1;
    }
         
    char line[MAX_LINE_LENGTH];
    for (i = 0; i < ROWS; i++) {
        // 读取当前行,若文件提前结束则退出循环
        if (fgets(line, MAX_LINE_LENGTH, in) == NULL) {
            break;
        }
        
        char *current = line;
        int num, chars_read;
        j = 0;
        
        // 从当前行解析整数,直到填满当前行或解析完所有数字
        while (sscanf(current, "%d%n", &num, &chars_read) == 1 && j < COLS) {
            a[i][j++] = num;
            current += chars_read;  // 移动指针到下一个数字的起始位置
        }
    } 
    fclose(in); 

    // 输出结果
    for (i = 0; i < ROWS; i++) {
        for (j = 0; j < COLS; j++) {
            printf("%d  ", a[i][j]);
        }
        printf("\n");
    }
    return 0;    
}

方式二:读取时检查换行符

在读取每个整数后,检查下一个字符是否为换行符,若是则结束当前行的读取,确保下一个整数填充到下一行的数组中。

#include <stdio.h>

#define ROWS 3
#define COLS 8 

int main() 
{ 
    int a[ROWS][COLS] = {0}; 
    int i, j; 
    FILE *in = fopen("data.txt", "r"); 
    
    if (!in) {
        perror("无法打开文件");
        return 1;
    }
         
    for (i = 0; i < ROWS; i++) {
        j = 0;
        while (j < COLS) {
            int num;
            // 读取整数,若读取失败(文件结束)则退出循环
            if (fscanf(in, "%d", &num) != 1) {
                break;
            }
            a[i][j++] = num;
            
            // 读取下一个字符,判断是否为换行
            int c = fgetc(in);
            if (c == '\n' || c == EOF) {
                break;
            }
            ungetc(c, in);  // 若不是换行,将字符放回输入流
        }
    } 
    fclose(in); 

    // 输出结果
    for (i = 0; i < ROWS; i++) {
        for (j = 0; j < COLS; j++) {
            printf("%d  ", a[i][j]);
        }
        printf("\n");
    }
    return 0;    
}

说明

两种方式都能实现你期望的输出:每行数字填满后剩余列补0,下一行从新的数组行开始填充。第一种逐行解析的方式更灵活,适合处理每行长度差异较大的情况;第二种方式更贴近你最初的代码逻辑,修改量较小。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 18:55:37