2016-08-02 13 views
-3

vigenere cipher.evenのために設計された以下のコードを実行している間、私は問題に直面しています。問題をデバッグできません。それはエラーを示しています:server.pleaseヘルプによって殺されました。Vigenere Cipher

/** 
* 
* vigenere.c 
* 
* Abhishek kumar 
* encrypts entered string using vigenere cipher 
* */ 
#include <stdio.h> 
#include <stdlib.h> 
#include <cs50.h> 
#include <ctype.h> 
#include <string.h> 

int main(int argc, string argv[]) 
{ 
    if (argc != 2) 
    { 
     printf("Usage: /home/cs50/pset2/vigenere <keyword>"); 
     return 1; 
    } 

    if (argc == 2) 
    { string key = argv[1]; 
     for(int k = 0,l = strlen(key);k < l; k++) 
     { 
      if(!isalpha(key[k])) 
      { 
       printf("Keyword must only contain letters A-Z and a-z"); 
       exit(1); 
      } 

     } 


     string txt = GetString(); 
     int i = 0,j = 0,c = 0; 
     int n = strlen(txt); 
     int m = strlen(key); 
     while(i < n) 
     { 
      if (isupper(txt[i])) 
      { 
       if(isupper(key[j])) 
       { 
        c = ((((int) txt[i] - 65 + (int) key[j] -65)%26) + 65); 
        printf("%c", (char) c); 
        i++; 
        j++; 
       } 
       if(islower(key[j])) 
       { 
        c = ((((int) txt[i] - 65 + (int) key[j] -97)%26) + 65); 
        printf("%c", (char) c); 
        i++; 
        j++; 
       } 

      } 
      else if (islower(txt[i])) 
      { 
       if(isupper(key[j])) 
       { 
        c = ((((int) txt[i] - 97 + (int) key[j] -65)%26) + 97); 
        printf("%c", (char) c); 
        i++; 
       } 
       if(islower(key[j])) 
       { 
        c = ((((int) txt[i] - 97 + (int) key[j] -97)%26) + 97); 
        printf("%c", (char) c); 
        j++; 
       } 


      } 
      else 
      { 
       printf("%c",txt[i]); 
       i++; 

      } 
      if (j == m-1) 
      { 
       j = 0; 
      } 
     } 




    } 
} 

下記のテストケースの一部が失敗しています。 islower(txt[i])セクションで

:) vigenere.c exists 
:) vigenere.c compiles 
:(encrypts "a" as "a" using "a" as keyword 
    \ killed by server 
:(encrypts "world, say hello!" as "xoqmd, rby gflkp!" using "baz" as keyword 
    \ killed by server 
:(encrypts "BaRFoo" as "CaQGon" using "BaZ" as keyword 
    \ expected output, but not "CGSFpp" 
:(encrypts "BARFOO" as "CAQGON" using "BAZ" as keyword 
    \ expected output, but not "CASFPO" 
:) handles lack of argv[1] 
:) handles argc > 2 
:) rejects "Hax0r2" as keyword 
+0

サンプル入力と出力を追加してください。 – merlin2011

+2

質問を依頼してください – dustinroepsch

+0

編集済み、今すぐチェックアウト。 –

答えて

0

、あなたはすべてのケースでijをインクリメントしません。 iをインクリメントしないところ、つまりキーの最初の文字とテキストの両方が小文字の場合、無限ループになります。 isupper(txt[i])セクションで

、あなたはif代わりのelse ifを使用するので、あなたがislower(key[j])一部を入力し、isupper(key[j])部分にijをインクリメントします。上記の両方について

else if(islower(key[j]))if(islower(key[j]))を変更し、各インナーifブロックの後j++printfを移動させます。 iについてはwhileforに変更し、そのうちiを増やしてください。

jをリセットする必要があるかどうかを確認するときは、keyの有効なインデックスはm-1ですので、まだリセットしないでください。 j == mのときに実行します。

また、実際の文字がASCIIコードに置き換えられているため、実際の作業がはっきりしています。キャストも必要ありません。

for (i=0; i < n; i++) 
    { 
     if (isupper(txt[i])) 
     { 
      if(isupper(key[j])) 
      { 
       c = (((txt[i] - 'A' + key[j] -'A')%26) + 'A'); 
      } 
      else if(islower(key[j])) 
      { 
       c = (((txt[i] - 'A' + key[j] -'a')%26) + 'A'); 
      } 
      printf("%c", c); 
      j++; 
     } 
     else if (islower(txt[i])) 
     { 
      if(isupper(key[j])) 
      { 
       c = (((txt[i] - 'a' + key[j] -'A')%26) + 'a'); 
      } 
      else if(islower(key[j])) 
      { 
       c = (((txt[i] - 'a' + key[j] -'a')%26) + 'a'); 
      } 
      printf("%c", c); 
      j++; 
     } 
     else 
     { 
      printf("%c",txt[i]); 
     } 
     if (j == m) 
     { 
      j = 0; 
     } 
    } 
+0

おやすみ屋です! –