Токенизировать ввод командной строки в C - PullRequest
2 голосов
/ 08 апреля 2011

пытается взять строку текста и токенизировать ее в имя файла и аргументы для execvp().Вот мой код, getArguments() - сломанная функция.В настоящее время попытка печати arguments[0] приводит к ошибке шины.

char* getFilename(char* input) {
    return strtok(input, " &");
}

char** getArguments(char* input) {
    char** arguments;
    int k = 0;
    char* tokenized;
    tokenized = strtok(input, " &");
    tokenized = strtok(NULL, " &");
    while (tokenized != NULL) {
        arguments[k] = tokenized;
        ++k;
        tokenized = strtok(NULL, " &");
    }
    return arguments;
}

Я использую ее следующим образом в моем коде следующим образом:

char* filename = getFilename(line);
char** arguments = getArguments(line);

Ответы [ 3 ]

2 голосов
/ 08 апреля 2011

Вызов getFilename изменяет строку, помещая символ '\ 0' после первого токена. Затем вы пытаетесь перезапустить в начале в getArguments. Это дает только первый токен, так как строка теперь преждевременно завершена. Вы можете решить эту проблему, избавившись от getFilename и получив его от getArguments.

char **arguments = getArguments(line);
char *filename = arguments[0];

Кроме того, вы должны выделить место для каждого указателя в массиве char **arguments;. Вы можете использовать realloc для динамического увеличения массива. Однако есть более эффективные подходы.

char** getArguments(char* input) {
    char** arguments;
    int k = 0;
    char* tokenized;
    arguments = calloc(1, sizeof (char *));
    tokenized = strtok(input, " &");
    /* don't eat the first token here since we want the filename in arguments */
    while (tokenized != NULL) {
        arguments[k] = tokenized;
        ++k;
        arguments = realloc(arguments, sizeof (char *) * (k + 1));            
        tokenized = strtok(NULL, " &");
    }

    /* an extra NULL is required to terminate the array for execvp() */
    arguments[k] = NULL;

    return arguments;
}
0 голосов
/ 08 апреля 2011

char **arguments - один указатель.Подумайте, куда он указывает ....

Подсказка: он должен указывать на полезное место, где он может содержать несколько указателей.

0 голосов
/ 08 апреля 2011

Вы не выделили памяти для char **arguments - это просто висячий указатель.

...