Порядок строк в 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