Создание терминального меню с вызовом - PullRequest
0 голосов
/ 18 ноября 2010

Что мне нужно сделать, так это создать терминальное меню, которое принимает различные типы аргументов, и помещать его в параметр массива. Ниже приведен код: Вот некоторые проблемы, которые у меня есть, и я не могу найти хорошее решение.

если я просто наберу 'list', я получу Недопустимую команду, я должен напечатать 'list' (список и пробел). Выбор меню new должен быть таким: new «Меня зовут привет». param [0] = new и param [1] = Меня зовут привет, (теперь я могу создать сообщение с пробелами).

Как мне это сделать?

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

int menu()
{
    printf(">");

    char line[LINE_MAX];
    int i = 0;
    char *param[4];

    while(fgets(line, LINE_MAX, stdin) != NULL) {
        param[i++] = strtok(line, " \n");

        if(param[0] != NULL) {
            char *argument;

            while((argument = strtok(NULL, "\n")) != NULL) {
                param[i++] = argument;
            }
        }

        if(strcmp(param[0], "new") == 0) {
            //new(param[1]);
            menu();

        } else if(strcmp(param[0], "list") == 0) {
            //list();
            menu();

        } else {
            printf("Not a valid command.\n\n");
            menu();
        }
    }

    return 0;
}

Ответы [ 4 ]

1 голос
/ 18 ноября 2010

Вы ограничиваете "".

fgets читает ENTER.

Итак, когда вы набираете "listENTER" и токенизируете пробелы, вы получаете один токен, а именно "listENTER».Позже вы сравниваете со «списком» и, конечно, он не совпадает.

Попробуйте

strtok(line, " \n"); /* maybe include tabs too? */

PS.Почему вы звоните menu рекурсивно?У вас уже есть while в функции ...

1 голос
/ 18 ноября 2010

Ваша проблема: param [i ++] = strtok (строка, "");будет разделяться только на пробел, а не на \ n (перевод строки).Попробуйте добавить это к вашему массиву разделителей.

О, и поздравляю вас с каким-то достойно выглядящим кодом, который чистый и хорошо отформатированный.Приятное изменение.

0 голосов
/ 18 ноября 2010

Причина, по которой вам нужно ввести «список», заключается в том, что ваш первый strtok токен до пробела, поэтому вам нужно ввести его в этом случае.Попробуйте разрешить и '\n', и пробел в качестве разделителей, т.е. замените второй параметр strtok на " \n".

Что касается кавычек, вам необходимо повторно объединить параметры, начиная с одного, начинающегося с кавычкидо одного, заканчивающегося одним, заменяя символы между ними пробелами.Или покончите с strtok и выполните синтаксический анализ, вручную перебирая символы в line.

0 голосов
/ 18 ноября 2010

Я не уверен, если это вызывает вашу проблему, но эти строки

        /*new(param[1]);

        /*list();

Начните комментарий, который никогда не заканчивается.

Если вы хотите, чтобы комментарии в одну строку вы могли использовать:

       // comment

(по крайней мере в C ++ и начиная с C99)

Но комментарии, начинающиеся с /*, должны заканчиваться */ и не быть вложенными:

/* comment */

/* also multi line
   allowed */

Поскольку вы начинаете комментарий в комментарии, ваш компилятор должен был выдать предупреждение, на самом деле это не должно компилироваться вообще.

...