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