2013-10-19 61 views
0

假設我試圖實現一個「菜單」,要求用戶輸入一個命令,然後調用執行該命令的函數。我決定聲明一個包含每個命令名的字符串數組,然後將該用戶的輸入與該數組中的字符串進行比較,以瞭解接下來要做什麼,而不是爲每個命令設置一組條件。爲每個命令實現一個沒有條件的設備菜單

喜歡的東西:

char* commands[] = {"cmd", "cmd1", "cmd2"}; 

然後:

while(strcmp(cmd, "end") != MATCH) { 

    printf("?:"); 
    scanf("%s", cmd); 

    for(i = 0; i < CMD_NUMBER; i++) { 
     if(strcmp(cmd, commands[i]) == MATCH) { 
      /*do something */ 

     } 
    } 
} 

有沒有一種方法調用的函數,而不必在這一點上的任何條件語句或switch語句?我正在考慮實現一個函數指針的結構,每個命令都有一個成員,然後使用它,但我不確定如何甚至可能。

回答

2

創建包含命令和指向功能的結構:

typedef struct { 
    char * cmd; 
    void (* func)(); 
} Command_t; 

Command_t commands[] = { 
    "cmd", func_cmd, 
    "cmd2", func_cmd2 
}; 

注意:您需要聲明此結構之上的功能,否則你的編譯器將不惜他們。

(編輯),只是爲了保持完整性,你會使用這個結構

for(i = 0; i < sizeof(commands)/sizeof(commands[0]); i++) 
{ 
    if(!strcmp(cmd, commands[i].cmd)) 
    { 
     commands[i].func(); 
     break; 
    } 
} 
+0

謝謝!我有點好奇,至於如何分配功能的地址,更具體地說,我想我想知道什麼時候鏈接器爲函數分配內存地址,然後如何在數組初始化時發揮作用像這樣? – Kafka

+0

它只是。在這方面沒有什麼特別的功能名稱。 – usr2564301

相關問題