2016-02-12 33 views
-6
main(int argc, char *argv[]) { 
    int i = 0; 
    unsigned long long input = strtoull(argv[1],NULL,10); 
    if (argc < 2){ 
     puts("Need an argument"); 
     return 0; 
    } 
} 

任何人都可以解釋爲什麼如果我只是在沒有參數的情況下在cmd中輸入程序名稱,這段代碼崩潰了嗎?我的代碼沒有捕獲空參數c

編輯:

新的代碼仍然空參數瞬間崩潰:

main(int argc, char *argv[]) { 
    if (argc > 2){ 
     puts("Too many arguments"); 
     return 0; 
    } 
    if (argc < 2){ 
     puts("Need an argument"); 
     return 0; 
    } 
    if(argv[1][0] == '-'){ 
     puts("Sorry, no negative numbers, try another input"); // no negatives 
     return 0; 
    } 
+0

當'argv [1]'是NULL並且它被取消引用時,你期望發生什麼?你需要檢查自己,而不是期望庫代碼爲你做。 – mah

+0

但如果argv [1]爲空,那麼argc小於2,它應該捕獲它 – Jacob

+0

@jacob您的行的順序非常重要。你首先做潛在的危險操作,然後再檢查,這是錯誤的。 – BitTickler

回答

2

你正在使用argv[1]你測試之前退出。因此,應檢查argc >= 2訪問argv[1]

+0

噢,我的上帝我怎麼沒有看到,我很抱歉問這樣一個愚蠢的問題! – Jacob

+0

因爲我檢查了你沒有解決的argc,這是我的困惑的根源,如果你想要做的只是發泄,請在其他地方留言你的挫敗感離子到別人身上 – Jacob

1

前的命令名稱被放置在指數爲零。你引用一個索引越界。

0

你能擴大你輸入到命令行正是執行程序?從給出的信息,這聽起來像你沒有輸入命令行參數。如果是這樣的話,那麼你必須在下面的行一個空引用異常:

unsigned long long input = strtoull(argv[1],NULL,10); 

可能的修改將是以下幾點:

if(argc >= 2) 
{ 
    //Note argv is the second argument (zero indexing) 
    unsigned long long input = strtoull(argv[1],NULL,10); 
} 

基本上,不要試圖讀取的argv [1 ]直到你知道它存在。

0

至於你編輯的代碼,你還在試圖取消引用的argv [1]任何控制語句之外。這會導致你的代碼崩潰。在嘗試使用它之前,確保有一個argv [1]。

if(argc > 2) 
{ 
    if(argv[1]......) 
}