私の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;
}
デバッグヘルプ(「なぜこのコードは機能していませんか?」)には、目的の動作、特定の問題またはエラー、および質問自体に再現するのに必要な最短コードが含まれている必要があります。明確な問題文がない質問は、他の読者にとって有用ではありません。参照:最小、完全、および検証可能な例を作成する方法。 – Olaf
便宜のために[mcve]。 – Yunnosch
現在の文字をアルファベットのインデックスに変換するのが最も簡単だと思います( 'a'を0、' z'を25、同様にA..Z)、キー文字をアルファベットのインデックスに変換し、アルファベットのサイズをモジュロにした2つのインデックスを追加し(0..25の範囲のアルファベットへのインデックスである結果を与える)、インデックスを適切な文字に戻す(「a」または「A」)。キーを何度も処理するので、それをインデックス値に前処理して、文字ごとに処理することはできません。また、小さなインライン関数を書くことも検討してください。 –