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[]'
  • matrixint 的(错误定义的)二维数组,但在最好的情况下 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