0

入力とオフセットを指定すると、出力を返すCaesar関数に取り組んでいます。やっているかどうかわかりません。ここで何が間違っていますか?どんな助けでも大歓迎です。また、誰かが unsigned char の扱い方を説明してくれたら。

void encrypt(unsigned char* message_input, char off, unsigned char* message_output) {

    int m_inp;

    while(*(message_input+ m_inp)!=EOF)
    {
        *(message_output+ m_inp) = (*((unsigned char*)input + m_inp) + offset )%256;
    }

}
4

2 に答える 2

1

コードには多くの正確性と文体の問題があります。

正確性の問題

  1. ループ変数m_inpは初期化されていません。

  2. unsigned charが に等しくなる可能性はほとんどありませんEOF。の値EOFは -1 です。ループが終了することはありません (非常に奇妙なアーキテクチャを使用している場合を除きます)。

  3. 従来の Caesar 暗号は、ASCII 文字セット全体ではなく、アルファベット順に動作します。

文体の問題

より「スタイル的に正しい」C を使用すると、他のプログラマーがコードを読みやすくなります。これらは主観的なものです。

  1. この名前m_inpは、短いループ内のループ変数の名前として不適切です。i代わりに使用してください。

  2. C ではまったく同等ですが、ptr[i]の代わりに読みやすいです。*(ptr + i)

  3. 入力を としてマークするconst unsigned char *と、変更されていないことがより明確になります。

  4. オフセットのint代わりに使用します。char

  5. 従来、関数の出力は左側に、入力は右側に配置されます。ただし、これは重要ではありません。

改訂されたコード

これがリビジョンのサンプルです。NUL で終了する文字列を受け取り、Caesar でエンコード/デコードされたバージョンを出力バッファーに書き込みます。これは私が関数を書く方法であり、必ずしもあなたがそれを書く方法ではありません:

void caesar(char *output, const char *input, int shift)
{
    int i;
    for (i = 0; input[i]; i++) {
        if (input[i] >= 'a' && input[i] <= 'z')
            output[i] = (input[i] - 'a' + shift) % 26 + 'a';
        else if (input[i] >= 'A' && input[i] <= 'Z')
            output[i] = (input[i] - 'A' + shift) % 26 + 'A';
        else
            output[i] = input[i];
    }
    output[i] = '\0';
}

Caesar の暗号化と復号化は、シフト値が異なるだけで、実際には同じ操作であることに注意してください。したがって、シフト 3 で暗号化すると、シフト -3 (または同等の 23) で復号化できます。

unsigned charまた、置き換えることcharもその逆も可能であり、すべてがまったく同じように機能することに注意してください(ただし、入力をキャストする必要があります)。

于 2013-03-03T22:10:27.800 に答える
0

あなたが書いたコードには多くの間違いがあります

1)m_inpを初期化していませんが、延期しています(message_output + m_inp)

2)入力文字列でEOFをチェックしていますが、これは意味がありません。

このコードを見てください、それはシーザー暗号のはるかに優れた実装です

#include <stdio.h>

void caesar (char cipher[], int shift);

int main () {

char cipher[50];
int shift;

printf("Enter text to be encrypted IN CAPITAL LETTERS ONLY: ");
scanf("%s", cipher);

printf("How many shifts do you prefer? 1-10 only: ");
scanf("%d", &shift);

caesar (cipher, shift);

return 0;
}

void caesar (char cipher[], int shift) {
  int i = 0;

  while (cipher[i] != '\0') {
    if ((cipher[i] += shift) >= 65 && (cipher[i] + shift) <= 90) {
      cipher[i] += (shift);
     } else {
      cipher[i] += (shift - 25); 
       }
    i++;
   }
  printf("%s", cipher);
}
于 2013-03-03T19:59:14.323 に答える