我不会做的是创建一个终端菜单,它接受各种类型的参数并将其放在数组参数中。以下是代码:这是我遇到的一些麻烦,无法找到一个好的解决方案。
如果我只输入'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;
}
答案 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
中的字符进行解析。