2017-07-03 13 views
-1

私のVigenere暗号に問題があります。私のメッセージを入力すると、結果はうまくいきますが、文字が 'z'を過ぎると 'a'にループバックせず、他のASCII文字も表示しています。さらに、メッセージを入れると、時には必要以上に多くの文字を取得することがあります。例:キーはこんにちは、メッセージはmmmmm(私は知っている、メッセージの多くはないが、それは例です)、出力はtqxx {{。助けてください!!!!私はVigenere Cipherの 'z'から 'a'にループを戻します。

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

int main(int argc, char *argv[]) 
{ 
    char *k; 
    if (argc!=2) 
    { 
     printf("Give one argument, not 2, not 3, not 4 , and not any other amount other than one"); 
     printf("\n"); 
     return 1; 
    } 
    k = argv[1]; 
    printf("What is the message? "); 
    string message = get_string(); 
    if (strlen(k)<strlen(message)) 
    { 
     printf("Invalid response\n"); 
     return 0; 
    } 
    for (int i = 0, l = 0; i < strlen(message); i++, l++) 
    { 
     int x; 
     if (message[i]>='A' && message[i] <='Z') 
     { 
      message[i] = message[i]-'A'; 
      message[i] = message[i] + (k[l] - 'A') % 26; 
      message[i] = message[i] + 'A'; 
      message[i] = (char) x; 
      if (x > 90) 
      { 
       x = x - 26; 
       message[i] = (char) x; 
      } 
      printf("%c", message[i]); 
     } 
     if(message[i] >='a' && message[i] <= 'z') 
     { 
      message[i]= message[i]-'a'; 
      message[i] = message[i] + (k[l] - 'a') % 26; 
      message[i] = message[i] + 'a'; 
      printf("%c", message[i]); 
     } 
     if ((message[i] < 'A') || (message[i] > 'z') || (message[i] > 'Z' && message[i] < 'a')) 
     { 
      printf("%c", message[i]); 
     } 
    } 
    printf("\n"); 
    return 0; 
} 
+0

デバッグヘルプ(「なぜこのコードは機能していませんか?」)には、目的の動作、特定の問題またはエラー、および質問自体に再現するのに必要な最短コードが含まれている必要があります。明確な問題文がない質問は、他の読者にとって有用ではありません。参照:最小、完全、および検証可能な例を作成する方法。 – Olaf

+0

便宜のために[mcve]。 – Yunnosch

+0

現在の文字をアルファベットのインデックスに変換するのが最も簡単だと思います( 'a'を0、' z'を25、同様にA..Z)、キー文字をアルファベットのインデックスに変換し、アルファベットのサイズをモジュロにした2つのインデックスを追加し(0..25の範囲のアルファベットへのインデックスである結果を与える)、インデックスを適切な文字に戻す(「a」または「A」)。キーを何度も処理するので、それをインデックス値に前処理して、文字ごとに処理することはできません。また、小さなインライン関数を書くことも検討してください。 –

答えて

0

message[i] + (k[l] - 'a')の部分に角かっこを付ける必要があります。モジュロは2番目の部分((k[l] - 'a'))にのみ適用され、式全体に適用されます。

また、k[l]は大文字/小文字のmessage[i]と同じですが、必ずしもそうであるとは限りません。それぞれの内側の枝に別の条件があるか、または(好ましい)数値の値がkの文字を計算し、0-25の範囲の数値として格納する必要があります。

第3に、xはなぜですか?初期化されていないときに使用され、一般的にはその存在の理由がわかりません。

最後に、kの最後に達したときに、メッセージがキーよりも長い場合は、lを再びゼロに設定する必要があります。