2010-11-18 53 views
0

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

如果我只是键入'list'我会得到不是一个有效的命令,我必须键入“列表”(列表和空格)。 菜单选择新应该是这样的:新的“我的名字是你好”。 param [0] = new和param [1] =我的名字是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; 
} 

回答

0

我不知道这是否会导致您的问题,但这些线路

 /*new(param[1]); 

     /*list(); 

开始是永远不会终止的评论。

如果你想要一个行注释,你可以使用:

 // comment 

(ATLEAST在C++和C99上)

但开始/*意见必须以*/并没有嵌套结束:

/* comment */ 

/* also multi line 
    allowed */ 

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

+0

嗯现在它被编辑了... ...但如果它以某种方式与问题的原因有关呢? – 2010-11-18 11:28:11

+0

你好..苏里,我的错,现在。我将这些函数注释掉了,你可以编译代码。 – user265767 2010-11-18 11:37:23

+0

抱歉关于编辑。上面的程序存在许多问题(包括程序逻辑)并且改变这些注释是必要的。但与这个问题没有关系:在评论之前提出的问题是关于东西发育的问题。 – pmg 2010-11-18 11:37:52

1

你在“”分隔。

fgets读取ENTER。

因此,当您键入“listENTER”并在空格处添加tokenise时,您将获得一个令牌,即“listENTER”。后来你比较“列表”,当然,它不匹配。

尝试

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

PS。你为什么递归地调用menu?你已经在功能while ...

+0

谢谢。这将解决其中一个问题!我怎样才能让菜单把“这个,即使有她的空间”放在param []中? – user265767 2010-11-18 11:43:55

+0

也许会问一个新问题......你需要检查'param'。它有四个指针的空间;你的字符串有4个以上的标记。 – pmg 2010-11-18 11:49:59

+0

你误会了。给出以下命令:new“my name is”,param [0] = new,param [1] =我的名字是。 – user265767 2010-11-18 12:04:10

1

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

哦,并祝贺一些体面的代码干净,格式良好。一个愉快的改变。

0

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

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