2015-11-08 49 views
-1

我有一個C程序需要讀取兩行用戶輸入。第一行是3個數字,空格分隔,第二行是單個數字。事情是這樣的:讀取用戶輸入的單獨行c

2 5 7 
6 

這裏是我的代碼:

int main(int argc, char** argv){ 
    int a, b, c, d; 
    char line[256]; 
    while(fgets(line, sizeof(line), stdin)){ 
     a = atoi(strtok(line, " ")); 
     b = atoi(strtok(NULL, " ")); 
     c = atoi(strtok(NULL, " ")); 
    } 
    scanf("%d", &d); 
    printf("a : %d b: %d c: %d d: %d",a, b, c, d); 

} 

這項計劃最終給我一個Segmentation Fault 11

+1

你有沒有用它調試器?例如'valgrind'會打印出發生錯誤內存操作的地方。無論你的輸入數據分成多行(假設第一行有2個數字),你仍然試圖從這行中得到3個值,因爲你從不檢查什麼是strtok返回的(如果它返回NULL,atoi會顯示段錯誤,顯然... )。 – hexasoft

+2

'scanf(「%d%d%d%d」,&a,&b,&c,&d);'而不是。 – BLUEPIXY

+1

@BLUEPIXY,答案不應在評論中。 – pgreen2

回答

2

while循環的第二次迭代將讀取第二行中,一個用只有一個整數。這意味着,在第一個調用strtok之後的任何後續調用將返回NULLatoi(NULL)將調用未定義的行爲(此處爲分段故障的形狀)。

假設文件始終具有完全相同的格式,你描述的文件,只是刪除while循環:

int main(int argc, char** argv){ 
    int a, b, c, d; 
    char line[256]; 

    fgets(line, sizeof(line), stdin)); 
    a = atoi(strtok(line, " ")); 
    b = atoi(strtok(NULL, " ")); 
    c = atoi(strtok(NULL, " ")); 

    scanf("%d", &d); 
    printf("a : %d b: %d c: %d d: %d",a, b, c, d); 
}