2012-10-13 39 views
0
#include <stdio.h> 

int main(int argc, char* argv[]){ 
    printf("argc: %d\n",argc); 
    for(int i=0;i<sizeof(argv);i++){ 
    printf("argv[%d] %s\n",i,argv[i]); 
    } 
    return(0); 
} 

編譯罰款,下GNU/Linux發行版argv如何填充?

printTest one\ two three 
argc: 3 
argv[0] /data/local/tmp/printTest 
argv[1] one two 
argv[2] three 
argv[3] (null) 

我故意留一個空格逃脫和argv似乎表現得真奇怪GNOME終端下使用時。

這種行爲是否正常?那是什麼?爲什麼argv創建一個空指針而不是僅僅提供一個更短的數組?

回答

7

sizeof(argv)是沒有意義的 - 它是指針的大小(在您的平臺上是4),在這種情況下恰好恰好是argv中的值的數量。

此處改爲使用argc

+0

ops,my bad ...:| | – user1717079

4

這種行爲是否正常?

是的,絕對。用one\ two你指定你想這是一個參數。

什麼是null?爲什麼argv創建一個空指針而不是僅僅提供一個更短的數組?

它顯示數組的末尾,並且是標準所要求的。這使得它可以遍歷所有參數不使用argc,例如:

while (*++argv) { 
    // do something 
} 

但你也有你的代碼中的錯誤,因爲duskwuff指出。

2

你不應該使用sizeof(argv):你只得到一個指針的大小您的系統上,參數的數目。

另請注意,argv[argc]NULL根據規範:將有NULLargv[argc]不管您的轉義空間,或參數的數量。

5.1.2.2.1/2

的argv [的argc]應爲空指針。

1

這是爲了支持典型的C-ISH成語:

for (char** arg = argv + 1; *arg; arg++) 
{ 
    // process next arg 

正如所看到的,是argv 0結尾的字符串的數組。

將輸入拆分爲單獨的參數由shell完成,該語言沒有定義它。