Порядок строк в C как аргумент командной строки

Мне нужно передать 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[]' "

2 ответа

Решение

Я пытаюсь это сделать:

int matrix[][] = argv[2]

Это не работает,

потому что это недопустимо из-за отсутствия ';':

  • необходимо указать по крайней мере второе измерение, поэтому у вас есть тип массива ошибок с неполным типом элемента 'int []'
  • matrix является (неправильно определенным) 2D-массивом int, но в лучшем случае 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
Другие вопросы по тегам