如何从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 documentation,scanf
读取由空格分隔的字符串,包括换行符。没有必要显式检查行尾字符。对于所描述的任务,只需读取所需数量的元素就足够了。
- 使用
fgets()
读到行尾。
- 使用
strtok()
和 space 作为分隔符换行
- 现在使用
strtol()
将每个标记转换为整数
- return值可以存储在数组中。
- 计算成功转换为整数的令牌数量并保持计数
- 根据计数分配内存。
- 如果计数为零,则没有整数,您可以优雅地忽略该行。
使用 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;
}
问题很简单,我应该如何将矩阵从标准输入保存到二维数组。问题是我不知道大小,而且我应该识别出错误的输入
正确输入示例:
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 documentation,scanf
读取由空格分隔的字符串,包括换行符。没有必要显式检查行尾字符。对于所描述的任务,只需读取所需数量的元素就足够了。
- 使用
fgets()
读到行尾。 - 使用
strtok()
和 space 作为分隔符换行 - 现在使用
strtol()
将每个标记转换为整数
- return值可以存储在数组中。
- 计算成功转换为整数的令牌数量并保持计数
- 根据计数分配内存。
- 如果计数为零,则没有整数,您可以优雅地忽略该行。
使用 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;
}