2016-11-03 17 views
0

工作通過一些C問題,並與此打牆。我可以想到另一種方式,但我想更好地理解爲什麼我的支票失敗。isalpha檢查參數導致分段錯誤

#include <stdio.h> 
#include <ctype.h> 
#include <math.h> 
#include <string.h> 

int main(int argc, char *argv[256]){ 
    //Require one alpha only argument if else exit 1 
    if(argc < 2){ 
     printf("Usage: ./vigenere arg1 [arg2] [arg3]...\n"); 
     return 1; 
    } 
    for (int i=1;i<argc;i++){ 
     if(isalpha(argv[i]) == 1){ 
      return 1; 
     } 
     printf("%d\n",i); 
    } 

    //Prompt the user for some plaintext 

    //Rotate plaintext by argument 

    //Print Rotated Text 

    // exit 0 
} 

該腳本按預期工作,直到isalpha()行。我會假設argv的非alpha字符在它們中!= 0 ergo跳過我的返回(1)。然而,無論插入什麼參數,它似乎都會失敗。

有什麼想法?

+1

當您逐步完成代碼時,調試器會顯示什麼內容?在segfault之前的'argv [i]'的內容是什麼? isalpha()的文檔說它接受什麼作爲參數?你究竟傳遞了什麼? –

+0

./vigenere abc 分段錯誤(核心轉儲) 現在正在逐步完成代碼,但我對gdb並不太熟悉。 這可能是我如何插入信息,如果argv包含多個單個字符比將整個字符串傳遞給isalpha而不是單個字符。 – Gates

+1

這對於您發佈的代碼來說是不可能的。該內容屬於'argv [0]',並且您的for循環從索引1開始。請重試,然後再次閱讀我的評論。 –

回答

3

打開-Wall的警告。

cc -Wall -g test.c -o test 
test.c:13:20: warning: incompatible pointer to integer conversion passing 'char *' to parameter of 
     type 'int' [-Wint-conversion] 
     if(isalpha(argv[i]) == 1){ 
        ^~~~~~~ 
/usr/include/ctype.h:218:13: note: passing argument to parameter '_c' here 
isalpha(int _c) 
      ^
1 warning generated. 

問題是這樣的循環。

for (int i=1;i<argc;i++){ 
    if(isalpha(argv[i]) == 1){ 
     return 1; 
    } 
    printf("%d\n",i); 
} 

它看起來像你假設argv是一個字符串(即char *)和argc是字符串的大小。所以你在循環遍歷argv中的所有字符。

但是argv是一個字符串列表(即char **)。相反,您可能希望用戶傳入一個字符串作爲一個參數,然後遍歷該字符串(即argv[1])檢查非字母字符。

if(argc < 2){ 
    fprintf(stderr, "Usage: %s <string>\n", argv[0]); 
    return 1; 
} 

char *input = argv[1]; 
for(int i = 0; i < strlen(input); i++) { 
    if(isalpha(input[i])) { 
     return 1; 
    } 
} 

請注意,我只是如果isalpha檢查是真實的,而不是如果是1,這是因爲isalpha returns non-zero if the character tests true。不保證它是1.

+1

這真了不起。謝謝你的幫助。 – Gates