2013-07-25 44 views
-2

所以我寫了這個小程序,我是一個新手。它打印出我給它的命令行參數。我只是不明白爲什麼它在我將i變量初始化爲1之前工作,但是當我改變它時,我得到了分段錯誤。一旦使用了printf(),命令行參數會發生什麼變化?

代碼:

#include<stdio.h> 

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

    if (argc > 1) { 
     printf("Filename: %s has %d arguments.", argv[0], argc); 
    } else { 
     printf ("No arguments found!"); 
     getchar(); 
     return 0; 
    } 

    int i = 1; 
    printf("The arguments are: \n"); 
    for (i < argc; ++i;) { 
     printf("Argument %d is: %s \n", i, argv[i]); 
    } 

    getchar(); 
    return 0; 
} 

我從來沒有見過它說,一旦他們被用來有事到命令行參數。然而我的假設是在我對它們使用printf()後發生的命令行參數。當計數器變量i初始化爲零時,它第一次工作。當我通過將我初始化爲1來重新編程以跳過zero-eth時,參數給我提供了分段錯誤。我這樣做是因爲我對發生的事情有點困惑。這不是第二次打印出文件名,就像我想它會改變它,所以它不會反正(很有意義吧?不是回想起來哈哈)。

+1

您已經在for循環的'initialization'部分編寫了測試;你有你的增量作爲一個測試(所以循環將運行,直到「i」增加到零,這將需要很長的時間(或當你訪問無效內存時崩潰你的程序);然後重新初始化子句是空的,你需要'for(int i = 1; i

+0

當人們甚至不知道**語法時,需要「最小的理解」 ** – 2013-07-25 15:29:29

+1

@ H2CO3:語法是正確的(如在允許的和可編譯的)。這是語法的錯誤語義。 –

回答

-1

如果你正在使用C的工作,你應該首先初始化聲明並初始化我和你的if語句你的程序,如果你改變INT I的安置工作正常= 1

+0

爲什麼投下來? – Engine

+2

不是我的倒票,而是因爲C99和C11都允許'int i = 1;'它寫入的地方。只有支持C89的古老編譯器(例如MSVC)不支持寫入「i」的聲明。 –

+0

我不明白程序如何將'int i = 1;'移動到某個地方,C89 –

2

您的循環被打破:

for(;i<argc;++i) 

第一個塊是初始條件,第二個塊是在每次迭代之前執行的檢查。正如你寫的那樣,檢查是++ i,即使在最後一個參數後也是如此。

0

使用For ... Next循環的正確方法是,像這樣(對於C1989分之1990):

int i; 
    printf("The arguments are: \n"); 
    for (i = 0; i < argc; i++) { 

的很多人都在抱怨我缺乏有關語法知識。我知道如何寫... for next loop。我用C++寫了很多,而C幾乎沒有區別。我遵循編譯器的警告並進行了調整,但並沒有真正考慮我正在做什麼或者檢查是否有其他人遇到同樣的問題。

因爲我使用GCC的編譯器並不完全支持C99,所以我選擇堅持使用C90作爲我的編譯選項。我只是在學C,而且我發現它很像C++(很喜歡),但我並沒有聲稱知道關於C或其以前版本的所有信息。

相關問題