C 中的行优先排序作为命令行参数
Row-major ordering in C as Command Line Argument
我需要通过如下所示的 txt 文件从命令行传入二维区域(矩阵):
0 0 0 0 0
0 1 1 0 0
0 0 1 0 0
0 0 1 0 0
0 0 0 0 0
我正在使用 C 并且需要按行优先顺序使用它,所以我正在尝试这样做:
int matrix[][] = argv[2]; // it is the second command line argument passed
这不行,是因为它需要是一维数组吗?我是否只允许使用常规的一维数组进行行优先排序?
我得到的错误是 "array type has incomplete element type 'int[]' "
I'm trying to do this:
int matrix[][] = argv[2]
This isn't working,
因为这是无效的,出于缺少';' :
- 至少必须给出第二个维度,这就是为什么会出现错误array type has incomplete element type 'int[]'
- matrix 是 int 的(错误定义的)二维数组,但在最好的情况下 argv[2] 是一个 char 数组:
- 如果不带参数调用程序 argv[2] 未定义
- 如果使用一个参数调用程序 argv[2] 为 NULL
- 如果调用程序至少有 2 个参数 argv[2] 是包含第二个参数的字符串
考虑到 argv[2] 是包含 5x5 矩阵的文件的路径名,矩阵的声明可以是:
int matrix[5][5];
并且需要读取文件中的值来设置矩阵的内容,不能直接将txt文件映射到matrix
示例:
#include <stdio.h>
int main(int argc, char ** argv)
{
FILE * fp;
if (argc < 3) {
fprintf(stderr, "usage: %s ?? <file>\n", *argv);
return -1;
}
else if ((fp = fopen(argv[2], "r")) == NULL) {
perror("cannot open file");
return -1;
}
else {
int matrix[5][5];
int i, j;
for (i = 0; i != 5; ++i) {
for (j = 0; j != 5; ++j) {
if (fscanf(fp, "%d", &matrix[i][j]) != 1) {
fprintf(stderr, "invalid file for [%d][%d]\n", i, j);
return -1;
}
}
}
fclose(fp);
/* debug */
for (i = 0; i != 5; ++i) {
for (j = 0; j != 5; ++j)
printf("%d ", matrix[i][j]);
putchar('\n');
}
putchar('\n');
/* you can also use it as a 1D array */
for (i = 0; i != 25; ++i) {
printf("%d ", ((int *) matrix)[i]);
if (i%5 == 4)
putchar('\n');
}
return 0;
}
}
编译执行:
pi@raspberrypi:/tmp $ gcc -Wall a.c
pi@raspberrypi:/tmp $ cat f
0 0 0 0 0
0 1 1 0 0
0 0 1 0 0
0 0 1 0 0
0 0 0 0 0
pi@raspberrypi:/tmp $ ./a.out whatever f
0 0 0 0 0
0 1 1 0 0
0 0 1 0 0
0 0 1 0 0
0 0 0 0 0
0 0 0 0 0
0 1 1 0 0
0 0 1 0 0
0 0 1 0 0
0 0 0 0 0
pi@raspberrypi:/tmp $
正如@bruno 的回答,你在声明二维数组时错了。我只是提出了一种解决方案,使用双指针从输入文件中获取信息(如果您之前不知道数组的大小(行数,列数),请使用它)。
您可以使用fgets
在文本文件中逐行获取。然后使用 strtok
函数以 space 分隔行。要从字符串中获取整数值,可以使用 atoi
函数。
完整代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char const *argv[])
{
char line[256];
int ** matrix = malloc(sizeof(int *));
if(!matrix)
return -1;
if (argc < 2) {
return -1;
// argv[1] is the name of input file, for example input.txt
FILE * fp = fopen(argv[1], "r");
int row = 0, col;
while(fgets(line, sizeof(line), fp)) {
col = 0;
matrix[row] = malloc(sizeof(int));
if(!matrix[row])
return -1;
char * token = strtok(line, " ");
while(token != NULL) {
matrix[row][col] = atoi(token);
token = strtok(NULL, " ");
col++;
// increase the size of each line after each loop
matrix[row] = realloc(matrix[row], (col+1) * sizeof(int));
if(!matrix[row])
return -1;
}
row++;
// increase size of matrix after each loop
matrix = realloc(matrix, (row+1)*sizeof(int *));
if(!matrix)
return -1;
}
for(int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
return 0;
}
测试:
#cat input.txt
0 0 0 0 0
0 1 1 0 0
0 0 1 0 0
0 0 1 0 0
0 0 0 0 0
./test input.txt
0 0 0 0 0
0 1 1 0 0
0 0 1 0 0
0 0 1 0 0
0 0 0 0 0
我需要通过如下所示的 txt 文件从命令行传入二维区域(矩阵):
0 0 0 0 0
0 1 1 0 0
0 0 1 0 0
0 0 1 0 0
0 0 0 0 0
我正在使用 C 并且需要按行优先顺序使用它,所以我正在尝试这样做:
int matrix[][] = argv[2]; // it is the second command line argument passed
这不行,是因为它需要是一维数组吗?我是否只允许使用常规的一维数组进行行优先排序? 我得到的错误是 "array type has incomplete element type 'int[]' "
I'm trying to do this:
int matrix[][] = argv[2]
This isn't working,
因为这是无效的,出于缺少';' :
- 至少必须给出第二个维度,这就是为什么会出现错误array type has incomplete element type 'int[]'
- matrix 是 int 的(错误定义的)二维数组,但在最好的情况下 argv[2] 是一个 char 数组:
- 如果不带参数调用程序 argv[2] 未定义
- 如果使用一个参数调用程序 argv[2] 为 NULL
- 如果调用程序至少有 2 个参数 argv[2] 是包含第二个参数的字符串
考虑到 argv[2] 是包含 5x5 矩阵的文件的路径名,矩阵的声明可以是:
int matrix[5][5];
并且需要读取文件中的值来设置矩阵的内容,不能直接将txt文件映射到matrix
示例:
#include <stdio.h>
int main(int argc, char ** argv)
{
FILE * fp;
if (argc < 3) {
fprintf(stderr, "usage: %s ?? <file>\n", *argv);
return -1;
}
else if ((fp = fopen(argv[2], "r")) == NULL) {
perror("cannot open file");
return -1;
}
else {
int matrix[5][5];
int i, j;
for (i = 0; i != 5; ++i) {
for (j = 0; j != 5; ++j) {
if (fscanf(fp, "%d", &matrix[i][j]) != 1) {
fprintf(stderr, "invalid file for [%d][%d]\n", i, j);
return -1;
}
}
}
fclose(fp);
/* debug */
for (i = 0; i != 5; ++i) {
for (j = 0; j != 5; ++j)
printf("%d ", matrix[i][j]);
putchar('\n');
}
putchar('\n');
/* you can also use it as a 1D array */
for (i = 0; i != 25; ++i) {
printf("%d ", ((int *) matrix)[i]);
if (i%5 == 4)
putchar('\n');
}
return 0;
}
}
编译执行:
pi@raspberrypi:/tmp $ gcc -Wall a.c
pi@raspberrypi:/tmp $ cat f
0 0 0 0 0
0 1 1 0 0
0 0 1 0 0
0 0 1 0 0
0 0 0 0 0
pi@raspberrypi:/tmp $ ./a.out whatever f
0 0 0 0 0
0 1 1 0 0
0 0 1 0 0
0 0 1 0 0
0 0 0 0 0
0 0 0 0 0
0 1 1 0 0
0 0 1 0 0
0 0 1 0 0
0 0 0 0 0
pi@raspberrypi:/tmp $
正如@bruno 的回答,你在声明二维数组时错了。我只是提出了一种解决方案,使用双指针从输入文件中获取信息(如果您之前不知道数组的大小(行数,列数),请使用它)。
您可以使用fgets
在文本文件中逐行获取。然后使用 strtok
函数以 space 分隔行。要从字符串中获取整数值,可以使用 atoi
函数。
完整代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char const *argv[])
{
char line[256];
int ** matrix = malloc(sizeof(int *));
if(!matrix)
return -1;
if (argc < 2) {
return -1;
// argv[1] is the name of input file, for example input.txt
FILE * fp = fopen(argv[1], "r");
int row = 0, col;
while(fgets(line, sizeof(line), fp)) {
col = 0;
matrix[row] = malloc(sizeof(int));
if(!matrix[row])
return -1;
char * token = strtok(line, " ");
while(token != NULL) {
matrix[row][col] = atoi(token);
token = strtok(NULL, " ");
col++;
// increase the size of each line after each loop
matrix[row] = realloc(matrix[row], (col+1) * sizeof(int));
if(!matrix[row])
return -1;
}
row++;
// increase size of matrix after each loop
matrix = realloc(matrix, (row+1)*sizeof(int *));
if(!matrix)
return -1;
}
for(int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
return 0;
}
测试:
#cat input.txt
0 0 0 0 0
0 1 1 0 0
0 0 1 0 0
0 0 1 0 0
0 0 0 0 0
./test input.txt
0 0 0 0 0
0 1 1 0 0
0 0 1 0 0
0 0 1 0 0
0 0 0 0 0