如何从c中的stdin读取矩阵

How to read matrix from stdin in c

问题很简单,我应该如何将矩阵从标准输入保存到二维数组。问题是我不知道大小,而且我应该识别出错误的输入

正确输入示例:

1 2 3
4 5 6
7 8 9

错误输入示例:

1 2 3
4 5 6 5
7 8 9

1 2 3 4

首先,我尝试使用 scanf 将值读取到一维数组直到 EOF,然后使用 1d array 2d array 创建。这个可以吗 ?我不知道 scanf 如何识别新行。

根据this documentationscanf 读取由空格分隔的字符串,包括换行符。没有必要显式检查行尾字符。对于所描述的任务,只需读取所需数量的元素就足够了。

  1. 使用fgets()读到行尾。
  2. 使用 strtok() 和 space 作为分隔符换行
  3. 现在使用 strtol()
  4. 将每个标记转换为整数
  5. return值可以存储在数组中。
  6. 计算成功转换为整数的令牌数量并保持计数
  7. 根据计数分配内存。
  8. 如果计数为零,则没有整数,您可以优雅地忽略该行。

使用 malloc() 初始分配内存给您的数组,您可以使用 realloc()

根据输入增加数组的大小

如果这对您来说不是问题,您可以在一维数组中读取它,获取矩阵大小 N=sqrt(elementsCount) 并在您的代码中访问元素,如下所示:

array[row*N + col]; //its equivalent of array2d[row][col] from 2d array

或者您可以将其读入一维数组,然后分配矩阵并在此处复制值。

此外,如果 stdin 中的换行符始终表示矩阵中的新行,您可以将其读入二维数组并在此过程中动态重新分配它。

我推荐第一种方法

//编辑当然,前两个解决方案适用于 NxN 矩阵。如果可以有MxN矩阵,则需要使用第三种方法

我试着用 gopl 解决方案来做。我错过了一些针对大小的验证并使用了一些常量,因为现在我不关心分配。重要的是只是从标准输入读取。那么这个正确的解决方案是如何从 stdin 逐行读取以 EOF

结尾的矩阵
#include <stdio.h>
#include <string.h>

#define BUFFERSIZE 10000

int main(int argc, char *argv[]) {


    char * pch;
    int matrix[25][25];
    int row = 0, column = 0;

    char buffer[BUFFERSIZE];
    printf("Enter a matrix: \n");
    while (fgets(buffer, BUFFERSIZE, stdin) != NULL) {
        pch = strtok(buffer, " ");
        column = 0;

        while (pch != NULL) {
            int li1 = strtol(pch, NULL, 10);
            pch = strtok(NULL, " ");
            matrix[row][column] = li1;
            column++;
        }
        row++;
    }
    printf("Number: %dvs%d\n", row, column);
    return 0;
}