C - Проверьте аргументы основного - PullRequest
0 голосов
/ 10 мая 2018

Мне нужно проверить аргументы главной функции. Вы можете запустить основной с 2 ​​опциями -a и --b value, но есть дополнительные опции, и вам нужно сказать входные файлы (1,2 ... N) и выходной файл.

Пример: ./main -a --b 2 input1 input2 output

Но варианты могут быть где угодно ...

Пример: ./main input1 -a input2 input3 input4 output --b 1

Минимум, необходимый для запуска программы, - это вход и выход.

Вот мой код:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

int NB = 1;
int FLAGA = 0;
const char *FILEOUT;
char *FILEIN[];

int args_check(int argc, char const **argv) {
    int index = 0;
    if(argc < 3){
         printf("Not enough args.\n");
         return -1;
    }
    for(int i = 1; i < argc; i++) {
        if(strcmp(argv[i], "-a") == 0) {
            FLAGA = 1;         
        }
        else if(strcmp(argv[i],"--b") == 0) {
            i++;
            NB = atoi(argv[i]);
        }
        else {
            FILEIN[index] = argv[i];
            index++;
        }
    }
    FILEOUT = FILEIN[index - 1];
    printf("Input(s) :");
    for(int i = 0; i < index - 1; i++)
        printf(" %s", FILEIN[i]);
    printf("\n");
    printf("Output : %s\n", FILEOUT);
    return index - 1;
}

int main(int argc, char const *argv[]) {
    int index = args_check(argc, argv);
    if(index < 0)
        return 1;
    for(int i = 0; i < index; i++)
        printf("%s\n", FILEIN[i]);
    return 0;
}

./main -a --b 1 test1 test2 test3 out, на моем терминале я вижу

 Input(s) : test1 out test3
 Output : out
 test1
 out
 test3

Почему я не получаю test1 test2 test3?

1 Ответ

0 голосов
/ 10 мая 2018

Вы неправильно печатаете элементы FILEIN в main:

for(int i = 0; i < index; i++)
    printf("%s\n", FILEIN);

Вы передаете FILEIN, который является массивом char *, в %s спецификатор формата, который ожидает один char *.Вы забыли проиндексировать этот массив:

for(int i = 0; i < index; i++)
    printf("%s\n", FILEIN[i]);

Что касается прочитанного ввода, не совпадающего с выводом, вот виновник:

char *FILEIN[];

Такое определение недопустимо как локальное илиглобальная переменная (только в качестве параметра функции), потому что размер массива не указан.gcc увидит это как массив с 1 элементом, хотя это расширение компилятора.В результате получается, что вы списываете конец массива, вызывая неопределенное поведение .

. Вам нужно присвоить этому массиву фиксированный размер, например:

char *FILEIN[100];

Тогда вам нужно убедиться, что вы не пишете больше (в данном случае) 100 элементов.

...