私は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);
}
このコードはこれまで見てみると面倒です。 'for(i = 0; i <10; i ++)'は次のようになります: 'for(i = 1; <10; i ++)'のように見えるように、一般的なヒントとしてスペースを入れて、 。また、なぜ何度か何度もやっているのですか? 'i = 0'から' t'まで3回に分けてループしています。最初の2人はまったく同じことをやっています。ロジックをクリーンアップするほど、問題をデバッグするのが簡単になります。 –
また、CS50(http://cs50.tv)でこれを行うのは間違いないので、人々があなたに答えを与えるとは思わないはずです。あなたが試したことを教えてください。これは宿題であることを明確にすべきです。 また、 'int i、k、t、j = 0;'はおそらくあなたの考えをしません。そして、あなたはi = 0から 't'まで反復しています。これは未定義です! –
ヒント:暗号化ループに 'printf'を追加して、' plaintext'と 'key'として使用している' char'を見てみましょう。あなたがキーを管理する方法に明らかな問題があるからです。コードを追加し、この行を追加しました。 '' printf( "char:%c +%c mod26 + A:%c \ n"、copykey [j]、enc [i]); ') – FredMaggiowski