0

我需要从命令行通过一个看起来像这样的 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

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

4

2 回答 2

0

作为@bruno 的回答,你在声明二维数组时是错误的。我只是提出一种解决方案来使用双指针从输入文件中获取信息(如果您之前不知道数组的大小(行数,列数),请使用它。

您可以使用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
于 2020-04-17T22:31:57.207 回答
0

我正在尝试这样做:

int matrix[][] = argv[2]

这行不通,

因为这是无效的,所以缺少了';' :

  • 至少必须给出第二维,这就是为什么你有错误数组类型有不完整的元素类型'int []'
  • matrix是一个(错误定义的)二维数组int但在最好的情况下argv[2]是一个 char 数组:
    • 如果程序在没有参数的情况下被调用argv[2]是未定义的
    • 如果使用一个参数调用程序argv[2]为 NULL
    • 如果使用至少 2 个参数调用程序,则argv[2]是包含第二个 arg 的字符串

考虑到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 $ 
于 2020-04-17T21:29:03.383 回答