2017-03-04 161 views
1

我試圖檢查第三命令行是一個數字,所以我做分段故障

int n; 
if (!isdigit(argv[3])) 
    { 
     fprintf(stderr, "n MUST be a number"); 
     return 4; 
    } else 
    { 
     n = atoi(argv[3]); 
     printf("%i\n",n); 
    } 

,但我發現

Segmentation fault 

但如果我只是做了

int n = atoi(argv[3]); 

它工作得很好,我真的不明白爲什麼

+2

'isdigit'需要一個'int',你給它一個'char *'。打開警告。 – DeiDei

+1

你在哪裏檢查'argc> = 4'? –

+2

'if(!isdigit(argv [3] [0])||(argv [3] [0] ==' - '&&!isdigit(argv [3] [1])))'同樣的第三個命令行是也許''argv [2]'(1st:argv [0],2nd:argv [1],3rd:argv [2]) – BLUEPIXY

回答

3

DeiDei的評論是正確的。看看路上的argv聲明:

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

這是一個指針數組,每個指針指向一個C字符串,即字符數組。所以argv[3]是指向第三個參數的第一個字符的指針。 (數組從0開始,但argv [0]是程序的名稱)。

ISDIGIT()聲明如下:

int isdigit(int c); 

因此它期待一個int,而不是一個指針。您需要取消引用指針您向ISDIGIT,像這樣:

isdigit(*argv[3]) 

(請記住,在C,一個char類型爲int的一個特例,所以編譯器是確定與此有關。)

+0

謝謝你解決了我的問題和我的理解哈哈:) –

3

From man isdigit: int isdigit(int c)。但argv[3]char*(地址爲char),所以存在不匹配。更多

參數的值必須可表示爲無符號字符或EOF的值。

由於argv[3]可能不能表示爲uchar,行爲是未定義的,並且您可能會收到分段衝突。