2010-11-18 97 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中的字符來解析。