2011-12-18 95 views
2

練習7-1。編寫一個程序,將大寫字母轉換爲小寫或小寫,取決於調用的名稱,如argv [0]中所示。K&R:練習7-1 - 如何調用?

對於那些你感興趣的寫程序,你可以在這裏找到樣品溶液:http://users.powernet.co.uk/eton/kandr2/krx701.html

我的問題,但這正是你如何調用該程序? argv [0]指的是程序的名稱,另外還有程序的文件路徑。當我在argv [0]上執行printf()時,如果通過我的code :: blocks IDE運行程序,它會從/ home輸出完整路徑。如果我嘗試通過命令行使用'./upper'(不含引號)執行程序,argv [0]在程序名稱之前包含'./'。

無論如何無需添加程序路徑到PATH環境變量來調用此程序?

+0

你是否將此作爲家庭作業?你的目標平臺是什麼(Windows,Linux等)? – 2011-12-18 05:40:31

+0

不是家庭作業 - 我現在只是作爲一種愛好編碼。我的平臺是Arch Linux虛擬機。在Windows中編碼(沒有像Cygwin這樣的* nix模擬器)會導致太多問題。 – 2011-12-18 05:51:34

+0

瞭解,這只是Microsoft API允許您確定簡化問題的工作目錄。 * nix世界中可能有類似的東西,我還沒有遇到過。 – 2011-12-18 05:54:13

回答

2

你可以編譯一次,無論輸出文件名(如:my_c_program),並與bash,使用:

$ exec -a upper ./my_c_program 
foo 
FOO 

$ exec -a lower ./my_c_program 
BAR 
bar 

如果你希望它在一個單獨的shell中運行:

$ bash -c "exec -a upper ./my_c_program" 

基本上,語法是exec -a <newname> <command>,其中<newname>argv[0]

+0

這樣做。謝謝!! – 2011-12-18 07:09:24

+0

如果應用程序以無關目錄的完整路徑運行,會發生什麼情況? – 2011-12-18 07:25:16

+0

@ M.Babcock:只要'-a'開關通過,它仍然有效。 – netcoder 2011-12-18 17:09:05

3

你能直接掃描最後的/字符的字符串,並使用該點的所有字符嗎?

+0

我不完全確定你的意思。你能提供一個例子嗎? – 2011-12-18 05:52:21

1

你可以寫一個execv(3)一個小包裝,做了EXEC你,與設置恰到好處的論點:

char *args = {"Uppercase", NULL}; 

execve("/path/to/your/Uppercase", args); 

或者,你可以讓你的程序是如何解析argv[0]更加靈活;如果給出目錄部分,請參閱strrchr(3)以獲取程序名稱的簡單方法。

2

正常情況下,argv[0]反映的是,正好是您鍵入命令提示符執行程序的內容。如果您的程序出現在PATH環境變量中包含的目錄中,則不必使用./或完整路徑指定目錄名稱。

但是,即使您的程序駐留在PATH目錄中,用戶仍可能鍵入完整路徑以指向可執行文件。你的程序應該準備好處理這個問題。

有關PATH環境變量以及如何對其進行修改的更多信息,請參閱shell文檔。

2

看看this answer。它討論瞭如何使用標準的Posix方法來確定應用程序的當前工作目錄,這是解決可執行文件位置所需的。基本上確定路徑是否是絕對路徑,如果它是按原樣執行,如果不是那麼(在檢查路徑終止符在arg [0]上之後)將arg [0]追加到當前工作目錄和操作系統應該找出其餘的(我相信;我已經完成了任何嚴重的* nix開發已經有幾年了)。