C 使用质询创建终端菜单

C 使用质询创建终端菜单,c,menu,terminal,wildcard,C,Menu,Terminal,Wildcard,我不想做的是创建一个终端菜单,它接受各种类型的参数,并将其放入数组参数中。下面是代码:这里有一些问题,我有,并不能找到一个很好的解决办法 如果我只是键入'list',我将得到一个无效的命令,我必须键入“list”(list和space)。 菜单选项new应该是这样的:new“My name is hello”。param[0]=new和param[1]=My name is hello(我可以创建带有空格的消息) 我怎样才能做到这一点 #include <stdio.h> #incl

我不想做的是创建一个终端菜单,它接受各种类型的参数,并将其放入数组参数中。下面是代码:这里有一些问题,我有,并不能找到一个很好的解决办法

如果我只是键入'list',我将得到一个无效的命令,我必须键入“list”(list和space)。 菜单选项new应该是这样的:new“My name is hello”。param[0]=new和param[1]=My name is hello(我可以创建带有空格的消息)

我怎样才能做到这一点

#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;
}
#包括
#包括
#包括
#包括
int菜单()
{
printf(“>”);
字符行[line_MAX];
int i=0;
char*param[4];
while(fgets(行、行最大值、标准输入)!=NULL){
参数[i++]=strtok(行“\n”);
如果(参数[0]!=NULL){
字符*参数;
而((参数=strtok(NULL,“\n”))!=NULL){
param[i++]=参数;
}
}
如果(strcmp(参数[0],“新”)==0){
//新的(参数[1]);
菜单();
}else if(strcmp(参数[0],“列表”)==0){
//list();
菜单();
}否则{
printf(“不是有效的命令。\n\n”);
菜单();
}
}
返回0;
}

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

        /*new(param[1]);

        /*list();
开始一个永不终止的评论

如果需要单行注释,可以使用:

       // comment

(至少在C++和C99上)

但是以
/*
开头的注释必须以
*/
结尾,并且不能嵌套:

/* comment */

/* also multi line
   allowed */
由于在注释中开始注释,编译器应该发出警告,实际上这根本不应该编译。

您在“”上划界

fgets
读取输入

因此,当您在空格处键入“listener”并标记化时,您会得到一个标记,即“listener”。稍后您将与“list”进行比较,当然,它不匹配

试一试


PS.为什么要递归调用
菜单?
函数中已经有一个

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


哦,祝贺您获得了一些外观不错、格式清晰的代码。这是一个令人愉快的变化。

您需要键入“list”的原因您的第一个
strtok
标记为空格字符,因此在本例中需要输入一个。请尝试同时允许
'\n'
和空格作为分隔符,即将
strtok
的第二个参数替换为
“\n”


至于引号,你需要重新组合参数,从一个以引号开头的参数到一个以引号结尾的参数,方法是用空格替换它们之间的字符。或者去掉strtok
,通过手动迭代

中的字符进行解析,现在它被编辑掉了……但是如果它是某个与问题的原因有关吗?嗨..对不起,我的错,是现在。我注释掉了这些函数,所以你可以编译代码。对不起,编辑。上面的程序有很多问题(包括程序逻辑)更改这些评论是必要的。但与问题无关:问题是关于评论行前出现的东西。我真的无法理解如何将这个突击队分为两个参数:新的“我的名字是”谢谢。这将解决其中一个问题!我如何才能让菜单将所有内容放在这两个参数之间“这,即使有空格她”进入param[]?可能会问一个新问题…你需要检查
param
。它有4个指针的空间;你的字符串有超过4个标记。你误解了。给出以下命令:new“my name is”,param[0]=new,param[1]=我的名字是。啊!我确实误解了。我的第一个想法是使用
strchr
…但是问一个新问题:这有点难:-)
strtok(line, " \n"); /* maybe include tabs too? */