2016-03-27 25 views
-2

私はVigenere暗号をプログラムする必要がありますが、私の出力は少し異なって見えます。Vigenere-cipherの間違った出力

入力:ポーtreti RAZ SA ohlasi キー: euhwa

出力: TI ANEXC YWZ WU VDLEMP 私が得たもの: TI ANEDM LHV SK SBSWSS

でしたあなたはしてください私が見つけ出すのを手伝ってください、なぜそれは正しく動作しませんか?

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

char* vigenere_encrypt(const char* key, const char* text) 
{ 
    if(key==NULL || text==NULL) 
     return NULL; 

    int i,k,t,j=0; 
    t = strlen(text); 
    k = strlen(key); 

    char* copy=(char*)malloc(strlen(text)+1); 
    char* enc=(char*)malloc(strlen(text)+1); 
    char* copykey=(char*)malloc(strlen(key)+1); 

    for (i=0;i<k;i++) 
    { 
     copykey[i]=toupper(key[i]); 
    } 

    for (i=0;i<k;i++) 
    { 
     if(!(isalpha(copykey[i]))) 
     { 
      free(copy); 
      free(copykey); 
      free(enc); 
      return NULL; 
     } 
    } 

    for (i=0;i<=t;i++) 
    { 
     copy[i]=toupper(text[i]); 
    } 

    for (i=0;i<=t;i++) 
    { 
     if (isupper(copy[i])) 
     { 
      enc[i]=(copy[i]+copykey[j])%26+'A'; 
      j++; 
      if (j>k) 
       j=0; 
     } 
     else enc[i]=copy[i]; 
    } 

    free(copy); 
    free(copykey); 
    return enc; 
} 

int main() 
{ 
    char* encrypted; 
    encrypted = vigenere_encrypt("euhwa","Po treti raz sa ohlasi!"); 
    printf("%s\n",encrypted); 
    free(encrypted); 
} 
+2

このコードはこれまで見てみると面倒です。 'for(i = 0; i <10; i ++)'は次のようになります: 'for(i = 1; <10; i ++)'のように見えるように、一般的なヒントとしてスペースを入れて、 。また、なぜ何度か何度もやっているのですか? 'i = 0'から' t'まで3回に分けてループしています。最初の2人はまったく同じことをやっています。ロジックをクリーンアップするほど、問題をデバッグするのが簡単になります。 –

+0

また、CS50(http://cs50.tv)でこれを行うのは間違いないので、人々があなたに答えを与えるとは思わないはずです。あなたが試したことを教えてください。これは宿題であることを明確にすべきです。 また、 'int i、k、t、j = 0;'はおそらくあなたの考えをしません。そして、あなたはi = 0から 't'まで反復しています。これは未定義です! –

+0

ヒント:暗号化ループに 'printf'を追加して、' plaintext'と 'key'として使用している' char'を見てみましょう。あなたがキーを管理する方法に明らかな問題があるからです。コードを追加し、この行を追加しました。 '' printf( "char:%c +%c mod26 + A:%c \ n"、copykey [j]、enc [i]); ') – FredMaggiowski

答えて

0

問題は、あなたがどう処理するかです:

さて、コードがかなりある

"ねえ、私は鍵を終え、戻ってゼロにjをもたらすことができます"混乱しないでください。ダブルコピー/ペースト(それは起こり得る)ではなく、最適化することができます(そしてすべきです)。

とにかく問題解決の方法は簡単です:

j>=kの場合は、jをゼロに設定する必要があります。 equalの部分はキーの長さに達したときに0にしたいので重要です。あなたがそれをしている方法(greater thanのテストのみ)は、無効なcopykey値を使用する余分なループを行います。キーの長さが5の場合、copykey[4]で停止する必要がありますが、余分なループはcopykey[5]が無効です。そして(un)幸いにもあなたは地獄にsegfaultしません。

for (i=0;i<=t;i++) 
{ 
    if (isupper(copy[i])) 
    { 
     enc[i]=(copy[i]+copykey[j])%26+'A'; 
     j++; 
     if (j >= k) 
      j=0; 
    } 
    else enc[i]=copy[i]; 
} 
+1

ありがとうございました!私は本当にあなたの助けに感謝します!私は感謝しています! – Kingusss12

+0

心配はありません、それは喜びです;) – FredMaggiowski

関連する問題