2016-05-01 8 views
0

なぜ動作しないのか分かりません。 3つ以上のargsがあるときには腹を立てますが、1つのVigenere argだけがあるときには腹を立てません。私は同じ問題を抱えていた他の人たちを見てきました。 ./vigenereを実行すると、セグメント化エラーが発生します。それは./vigenere bardのように2つの引数で正常に動作し、余分な引数が./vigenere bard dfadsのように与えられたときに不平を言います。Vigenere cs50は2番目の引数が不足していると文句を言わない

#include <cs50.h> 
#include <stdio.h> 
#include <string.h> 
#include <ctype.h> 
#include <stdlib.h> 




int main(int argc,string argv[]) 
{ 

string sKeyWord = argv[1];     
int iKeyLength = strlen(sKeyWord);   
int iKey[iKeyLength];       
string sPlainText = ""; 
int counter = 0; 
int iAccept = 0; 
do 
{ 
    if(argc != 2) // <-----this should work whats wrong? 
     { 
      printf("Invalid argument! Please enter program name and   keyword.\n"); 
      return 1; 
     } 
    else if(argv[1]) 
     { 
     for(int i = 0; i < iKeyLength; i++) 
      { 
       if (!isalpha(argv[1][i])) 
       { 
        printf("Invalid entry, please use letters only.\n"); 
        return 1; 
       } 
       else 
       { 
        iAccept = 1; 
       } 
      } 
     }  
}while(iAccept == 0); 


for(int i = 0; i < iKeyLength; i++)   
    { 
     iKey[i] = toupper(sKeyWord[i]) - 65;  
    } 

sPlainText = GetString();      
int iPlainText = strlen(sPlainText);   


for(int j = 0; j < iPlainText; j++) 
    { 
     if(!isalpha(sPlainText[j])) 
      { 
       printf("%c",sPlainText[j]); 
       counter++; 
      } 
     if(islower(sPlainText[j])) 
      { 
       printf("%c",((((sPlainText[j] - 97) + iKey[(j - counter)%iKeyLength])%26)+ 97)); 
      } 
     if(isupper(sPlainText[j])) 
      { 
       printf("%c",((((sPlainText[j] - 65) + iKey[(j - counter)%iKeyLength])%26)+ 65)); 
      } 

    } 
printf("\n"); 

return 0; 
} 
+2

より早く調査する必要があります。例えば、文字列の前にsKeyWord = argv [1]; ' – BLUEPIXY

+0

DOH!ありがとうbluepixy *ハイファイブ*私の救世主!文字列skeyWord = ""に変更されました。 do whileループの最後にargv [1]を割り当てます。 – Firecore

+0

なぜdo-whileループの引数をチェックしていますか? (ヒント:私はあなたがこのコードをループに入れる必要はないと思う) –

答えて

0

私はこのようなプログラムの引数の扱いについてのセクションを書き直したいと思います。

int main(int argc, char **argv) 
{ 
    if (argc != 2) 
    { 
     fprintf(stderr, "Usage: %s key\n", argv[0]); 
     return 1; 
    } 
    char *sKeyWord = argv[1];     
    int iKeyLength = strlen(sKeyWord);   
    int iKey[iKeyLength];       

    for (int i = 0; i < iKeyLength; i++) 
    { 
     if (!isalpha(sKeyword[i])) 
     { 
      fprintf(stderr, "%s: Invalid character '%c' in key; please use letters only.\n", 
        argv[0], sKeyword[i]); 
      return 1; 
     } 
     iKey[i] = toupper(sKeyWord[i]) - 'A'; 
    } 

    …your code to read the text to be enciphered and encipher it, etc… 

重要な点は、何かをしようとする前にargv[1]があることを確認することです。私はdo { … } while (…);ループを削除しました。これは、引数が2回目の繰り返しで変更されないためです。これにより、変数iAcceptが削除されます。エラーは標準出力ではなく標準出力で報告されることに注意してください。また、メッセージの前にはプログラム名(argv[0])が付いています。 「Usage」メッセージは、しばしば問題を報告する最善の方法です。必要なものをプログラムを実行する人には簡単な思い出です。アルファベットチェックのエラーメッセージは、誤った文字を報告することに注意してください。それは人々がプログラムが間違っていると思うものを見るのを助ける。

これは多かれ少なかれ、コメントが示唆していたことを示唆しています。

私は暗号化コードを見直していません。それには未診断の問題があるかもしれません。あなたには、このような問題に対する答えをあなたに提供する多くの関連する質問があります。

関連する問題