2016-11-03 3 views
0

Cの問題が発生しており、これで壁に衝突しています。私はこれについて別の方法または2つを考えることができますが、私はなぜ私の小切手が失敗しているかを理解したいと思います。引数の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の文字はアルファベットではないと仮定しよう!= 0 ergoは私のリターンをスキップする(1)。しかし、引数として何が挿入されたかに関係なく失敗するようです。

どのような考えですか?

+1

コードをステップ実行したときに、デバッガはあなたに何を表示しますか? segfaultの直前の 'argv [i] 'の内容は何ですか? isalpha()のドキュメントは引数として受け入れるとはどういう意味ですか?あなたは実際にそれに何を伝えていますか? –

+0

./vigenere abc セグメンテーションフォールト(コアがダンプされている) コードをステップ実行していますが、私はあまりgdbに詳しいことはありません。 argvに1文字以上の文字が含まれていて、個々の文字の代わりに文字列全体を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 **)。その代わりに、おそらくユーザーが1つの引数として文字列を渡し、それを反復する(つまり、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が、それはisalpha returns non-zero if the character tests trueためだ1だいない場合は、trueの場合、私はちょうどチェックしてることに注意してください。それが1になるという保証はありません。

+1

これは素晴らしいです。ご協力いただきありがとうございます。 – Gates

関連する問題