Порядок старших строк в C в качестве аргумента командной строки - PullRequest
0 голосов
/ 18 апреля 2020

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

0 голосов
/ 18 апреля 2020

Как ответ @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
0 голосов
/ 18 апреля 2020

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

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];

, и вам нужно прочитать значения в файле, чтобы установить содержимое матрицы, вы невозможно напрямую сопоставить текстовый файл с 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 $ 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...