如何从c中的stdin读取矩阵

时间:2015-01-09 09:57:35

标签: c matrix

问题很简单我应该如何将矩阵从stdin保存到2d数组。问题是我不知道大小,我也应该认识到错误的输入

正确输入的示例:

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数组2d数组创建。这个可以吗 ?我不知道scanf如何识别新行。

4 个答案:

答案 0 :(得分:4)

  1. 使用fgets()读取到行尾。
  2. 使用strtok()和空格作为分隔符
  3. 分隔行
  4. 现在使用strtol()
  5. 将每个标记转换为整数
  6. 返回值可以存储在数组中。
  7. 计算成功转换为整数的令牌数并保持计数
  8. 根据计数分配内存。
  9. 如果计数为零,那么就没有整数,你可以优雅地忽略该行。
  10. 使用malloc()最初为数组分配内存,您可以使用realloc()

    根据输入增加数组的大小

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

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

另外,如果stdin中的换行始终表示矩阵中的新行,则可以将其读入2d数组并在此过程中动态重新分配。

我会建议第一种方法

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

答案 3 :(得分:0)

我试着用gopl sollution做到这一点。我想念一些针对大小的验证并使用一些常量,因为现在我不关心分配。重要的是从stdin读取。这是正确的解决方案,如何从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;
}