繁体   English   中英

如何从c中的stdin读取矩阵

[英]How to read matrix from stdin in c

问题很简单,如何将矩阵从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如何识别新行。

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

使用malloc()最初为数组分配内存,然后可以使用realloc()根据输入来增加数组的大小

根据本文档scanf读取由空格分隔的字符串,包括换行符。 不必显式检查行尾字符。 对于所描述的任务,仅读取所需数量的元素就足够了。

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

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

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

同样,如果stdin中的换行符总是表示矩阵中有新行,则可以将其读入2d数组并在此过程中动态地重新分配它。

我建议第一种方法

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

我尝试用gopl解决方案做到这一点。 我错过了一些针对大小的验证,并使用了一些常量,因为现在我不在乎分配。 重要的只是从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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM