将C中的行主排序作为命令行参数



我需要从命令行通过一个看起来像这样的txt文件传入一个2D区域(一个矩阵(:

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

这不起作用,是因为它需要是一个一维数组吗?我是否只允许使用常规1D数组进行行主排序?我得到的错误是"数组类型有不完整的元素类型'int[]'">

我正在尝试这样做:

int matrix[][] = argv[2]

这不起作用,

因为这是无效的,缺少";":

  • 至少必须给出第二个维度,这就是为什么出现错误数组类型具有不完整的元素类型"int[]">
  • matrixint的2D数组(定义错误(,但在最佳情况下,argv[2]为char数组:
    • 如果在没有参数的情况下调用程序argv[2]未定义
    • 如果用一个参数调用程序,则argv[2]为NULL
    • 如果程序调用时至少有两个参数argv[2]是包含第二个参数的字符串

考虑到argv[2]是包含5x5矩阵的文件的路径名,矩阵的声明可以是:

int matrix[5][5];

并且你需要读取文件中的值来设置矩阵的内容,你不能直接将txt文件映射到矩阵

示例:

#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的答案,您在声明2D数组时是错误的。我只是提出了一个用双指针从输入文件中获取信息的解决方案(如果你以前不知道数组的大小(行数,列数(,就用它。

您可以使用fgets在文本文件中逐行获取。然后使用strtok函数按空格分隔行。要从字符串中获取整数值,可以使用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

最新更新