2012-10-07 83 views
1

所以,我正在製作一個Unix minishell,並且遇到了障礙。我需要能夠執行內置函數,所以我提出的函數:C映射字符串到函數

int exec_if_built_in(char **args) 

它需要一個字符串數組(第一個是命令,和其餘爲參數)。對於非內置命令,我只需使用像execvp這樣的東西,但是我需要找到一種將第一個字符串映射到函數的方法。我正在考慮製作兩個數組,一個字符串,另一個使用相應的函數指針。但是,由於這些功能中的許多功能會有所不同(返回並接受不同的事物),所以這種方法將不起作用。我也想過使用一個名稱屬性和一個函數指針屬性來創建一個結構數組,但是再一次由於我將使用的函數的性質不同,這是行不通的。

那麼,基於字符串輸入來執行函數的最佳方法是什麼?如何將字符串映射到某個函數?我不太熟悉函數指針,所以我可能會錯過一些東西。

謝謝你們的幫助:)

+1

該ptr-ptr上的任何邊界?即有沒有一個argc符合那個?我認爲你可能遲早會需要一個,特別是如果命令有參數並且你想驗證它們。 – WhozCraig

+0

我對你所問的有點困惑。有1024個字符的限制可以傳遞到shell。我分解了用戶輸入到字符串數組中的字符串。我可以很好地構建函數,我只需要找到一種方法來調用與其字符串關聯的函數。 – robins35

回答

3

我想使兩個數組,字符串中的一個,而另一個與它們對應的函數指針。

這是正確的做法。使包含相同類型參數的包裝函數*然後從包裝器中調用「真實」函數。

如果您想「爲樣式贏得更多積分」,請按字母順序排序字符串數組,並對字符串數組使用二進制搜索。這會讓你在兩個陣列變大時節省幾個CPU週期。


*也許你可以使用char **,因爲這是你的exec_if_built_in需要什麼。

+1

+1:非常合身。 – WhozCraig

+0

哦,但它的回報值呢?做好解決任何事情的方法。 我不太明白什麼是相同的類型*,或者什麼是實際功能。 – robins35

+1

@Scriptonaut這裏有一個星號可以引導你關注'char **'的腳註。就返回類型而言,確保它們都返回相同的東西。 'int'聽起來很不錯。本質上,你的'exec_if_built_in'將是第一級調度:它將按名稱選擇一個命令,並將控制傳遞給實現它的包裝器。包裝器可以根據需要使用真實函數,並返回一個'int',這個'exec_if_built_in'將返回給它的調用者。每個命令都有自己的能夠執行該命令的包裝器。 – dasblinkenlight

1

如果你的情況不同,所以表驅動的做法是不恰當的,那麼也許一個if/else語句,如果級聯是最好的解決方案。

if(!strcmp(args[0], "cat")) { 
    /* cat a file */ 
} else if(!strcmp(args[0], "dog")) { 
    /* dog a file */ 
} else if(!strcmp(args[0], "echo")) { 
    /* create an echo chamber */ 
} ... 
+0

問題是找不到匹配的字符串,這就是我一旦找到匹配就執行該函數的方式。我錯過了什麼嗎? – robins35

+1

在這裏,您只需將函數調用它說'/ *貓文件* /'... – nneonneo

+0

這是我可以完全實現的,但是我的任務(我是一個CS專業)說要避免if/else - 如果級聯。如果我想不出更優雅的東西(我不會被扣除),我仍會這樣做。 說真的,謝謝你的幫助。過去11個小時,我一直在撞牆。 – robins35