创建带挑战的终端菜单

时间:2010-11-18 11:15:48

标签: c menu terminal wildcard

我不会做的是创建一个终端菜单,它接受各种类型的参数并将其放在数组参数中。以下是代码:这是我遇到的一些麻烦,无法找到一个好的解决方案。

如果我只输入'list',我将得到Not a valid命令,我必须输入“list”(列表和空格)。 菜单选择新应该是这样的:新的“我的名字是你好”。 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 个答案:

答案 0 :(得分:1)

你正在界定“”。

fgets读取ENTER。

因此,当您在空格处键入“listENTER”并进行标记时,您将获得一个标记,即“listENTER”。稍后您将与“列表”进行比较,当然,它与之不匹配。

尝试

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

PS。你为什么递归地调用menu?您已在函数中有while ...

答案 1 :(得分:1)

你的问题是param [i ++] = strtok(line,“”);只会在空格上分割,而不是\ n(换行)。尝试将此添加到您的分隔符数组中。

哦,祝贺一些看起来干净且格式正确的代码。一个愉快的变化。

答案 2 :(得分:0)

我不确定这是否会导致您的问题,但这些行

        /*new(param[1]);

        /*list();

开始永不终止的评论。

如果您想要一行评论,可以使用:

       // comment

(至少在C ++和C99上)

但以/*开头的评论必须以*/结尾,而不是嵌套:

/* comment */

/* also multi line
   allowed */

由于您在注释中开始注释,您的编译器应该发出警告,实际上这根本不应该编译。

答案 3 :(得分:0)

您需要输入“list”的原因是您的第一个strtok标记直到空格字符,因此在这种情况下您需要输入一个空格字符。尝试同时允许'\n'和空格作为分隔符,即将strtok的第二个参数替换为" \n"

至于引号,你需要重新组合从一个开始的一个参数到一个以一个结尾的参数,方法是用空格替换它们之间的字符。或者取消strtok并通过手动迭代line中的字符进行解析。