2014-09-22 62 views
-1

這可能比我做的要簡單得多,但我在解析沒有給出大小參數的命令行參數時遇到了問題(即,我在問對於int main(char * argv [])而不是使用int main(int argc,char * argv []))。我想這是真的更多的是兩個部分問題,但我想知道(1)你可以運行命令行參數的程序如下所示?:解析命令行參數,但沒有指定參數的數量C++

testProgram arg1 arg2 arg3 

,其中Arg1,ARG2和ARG3會被放置在argv []中,並且(2)如果可以的話,你如何循環每個參數以便你能夠在程序中使用它們?

我知道這可能看起來很隨意,但我想更好地理解命令行參數如何工作以及如何正確使用它們。

感謝您的幫助和了解。

+0

你試過嗎? – 0x499602D2 2014-09-22 00:30:50

+0

@ 0x499602D2對不起,我在做一個假設,但你的意思是我嘗試過類似** testProgram arg1 arg2 arg3 **的東西嗎?如果是這樣,那麼是的,每當我嘗試做一個簡單的第一個參數時,我會得到類似於** testProgram:arg2:預期的二元運算符** – 2014-09-22 00:44:51

回答

1

argc告訴你程序收到了多少個參數。因此,argv[0]指的是程序本身的名稱,argv[1]指向您在命令行上傳遞的第一個參數,argv[2]指向下一個,等等直至argv[argc-1],這是最後一個。接着是argv[argc],它是一個空指針。

所以,當你運行程序時,你不必指定參數的數量 - 你只需要傳遞任意數量的參數。然後,庫中的一些代碼會通過,將您傳遞的內容拆分爲單個參數,並告訴程序找到了多少個參數。

督察,當你運行:

testProgram ARG1參數3

你的程序將獲得:

argv[0] = testProgram 
argv[1] = arg1 
argv[2] = arg2 
argv[3] = arg3 
argv[4] = null pointer 
argc = 4 

注:argv[0]的確切內容是開放的變化 - 它可能正是您輸入以調用命令的內容,或者它可能是命令的完整路徑,或者它可能(特別是在古代系統中)是一個空字符串。在大多數現代系統中,它通常會包含類似文件名稱的內容。

+0

'argv [0]'是一個空指針也是可能的'argc'爲'0') – 2014-09-22 01:25:25

3

簽名

int main(char* argv[]) 

不被任何C++編譯器,我知道的支持。現在很少有人承認。但仍然。


簽名

int main(int argc, char* argv[]) 

是標準的,行之有效的純ASCII參數。

對於Unix-land中的一般Unicode參數,當它們被編碼爲UTF-8時,它也可以很好地工作。

無論如何,它會告訴你參數的數量。

0

可以忽略argc參數和處理argv[]元素,直到你到了一個,因爲指定了argv陣列有一個哨兵元素是NULL這是NULL。我不確定問題的根本點在哪裏。

#include <stdio.h> 

int main(int argc, char** argv) 
{ 
    while (*argv) { 
     puts(*argv); 
     ++argv; 
    } 
    return 0; 
}