2012-10-21 301 views
0
#include<stdio.h> 

int main(int number, char arg[]) 
{ 
    int i; 

    printf("%d\n",number); 

    for(i=0;i<7;i++) 
     printf("%c",arg[i]); 
    printf("\n"); 

    return 0; 
} 

我在Ubuntu終端上運行,並通過鍵入運行它「./a.out".I預期輸出是」 ./a.out」,而是一些垃圾值越來越打印。請解釋爲什麼?命令行參數傳遞

回答

2

您的main()簽名是錯誤的:

int main(int number, char arg[]) 

應該是:

int main(int number, char *arg[]) 

然後訪問它像一個二維陣列,同時在印刷,如:

for(i=0;i<strlen(argv[0]);i++) 
    printf("%c",arg[0][i]); 

或只是打印索引0處的字符串:

printf("%s",arg[0]); 
+0

不僅如此,除非arg是一定要有足夠的值,使得arg [7]是一個有效的數組訪問,代碼本質上是從內存中抽取一個隨機值,不是嗎? – mlibby

+0

@mcl這是一個非常有用的觀點。因爲,OP似乎想要使用字符打印,所以我將其更改爲使用'strlen',因爲字符串保證具有空終止。 –

+0

@KingsIndian你也應該優化'strlen(argv [0])'部分到一個變量 - 在每個單獨的操作上調用strlen是不需要的,並不是每個編譯器都能夠實現這個事實。 – 2012-10-21 13:29:05

0

main的簽名是int main (int argc, char* argv[]) - 即argv是一個字符串數組,而不是一個字符數組。

2

因爲您缺少argv的類型。操作系統爲你分析參數(用空格分隔它們),所以你最終會得到一個字符串數組。你應該寫:

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

    return 0; 
} 

爲了得到整個命令行回調。

P.S。:你真的應該命名main() argc和argv的論點。這是慣用的,不這樣做是奇怪。

+1

注意到循環需要'我 mlibby

0

主函數按照約定將int作爲第一個參數(這在代碼中是可以的),但第二個參數必須是一個字符數組的指針(char *argv[])。

這必須是這樣的,因爲當你的程序被調用時,它的數據庫中就會有數據。 如果調用./a.out foo bar,陣列將是

arg[0] = "./a.out" 
arg[1] = "foo" 
arg[2] = "bar" 

和整數將包含3,給你的程序參數的個數。

如果你想打印給你的程序及其參數的參數的數量,你就需要將代碼轉換到這個

int main(int number, char *arg[]) // the right main prototype 
{ 
    int i; 

    printf("%d\n",number); 

    for(i=0;i<number;i++) // from i = 0 to the number of parameters 
     printf("%s\n",arg[i]); // print a string (%s) 

    return 0; 
}