0

C++ を使用して Caesar 暗号を作成しようとしています。プログラムをテキスト ファイルで読み込んでいますが、テキストを暗号化して画面に出力する必要があります。

これは私の暗号化コードですが、機能させることができないようです。私は C++ を使い始めたばかりで、ここからどこへ行くべきかよくわかりません。

cout << "enter a value between 1-26 to encrypt the text: ";
cin >> shift;

while ((shift <1) || (shift >26)) {
    cout << "Enter a value between 1 and 26!: ";
    cin >> shift;
}

int size = strlen(text);
int i=0;

for(i=0; i<size; i++) {
    cipher[i] = (text[i]);
    if (islower(text[i])) {
        if (text[i] > 122) {
            cipher[i] = ( (int)(text[i] - 26) + shift);
        }
    } else if (isupper(text[i])) {
        if (text[i] > 90) {
            cipher[i] = ( (int)(text[i] - 26) + shift);
        }
    }
}

cipher[size] = '\0';
cout << cipher << endl;
4

3 に答える 3

1

まず、アルゴリズムが間違っています。

ASCII入力を想定する場合、32 (スペース) から 126 (チルダ ~) までの値を暗号化する必要があります。これを行うには、キー (単一の数値) を値に追加します。結果が 126 (使用可能な最大の文字) より大きい場合は、折り返して 32 からカウントを開始する必要があります。これは、126 + 1 = 32、126 + 2 = 33 などを意味します。「モジュロ」を調べてください。

「デバッグ」という言葉を調べることをお勧めします。一般に、アルゴリズムがある場合は、そのアルゴリズムにできるだけ一致するコードを記述します。結果が予期したものではない場合は、行が予期した結果であり、コードの結果が一致しなくなるまで、デバッガーを使用して行ごとにステップ実行します。

于 2012-12-04T17:39:12.750 に答える
0

再フォーマットし、コンパイル可能な広告固定アルゴリズムを作成しました(達成しようとしたと思います)

#include <iostream>
using namespace std;

char text[] = {"This is my encryption code but I can't seem to get it to work. "
               "I have only just started using C++ and not really sure where "
               "to go from here."};
char cipher[sizeof(text)];

void main()
{
    int shift;
    do {
        cout << "enter a value between 1-26 to encrypt the text: ";
        cin >> shift;
    } while ((shift <1) || (shift >26));

    int size = strlen(text);
    int i=0;

    for(i=0; i<size; i++)
    {
        cipher[i] = text[i];
        if (islower(cipher[i])) {
            cipher[i] = (cipher[i]-'a'+shift)%26+'a';
        }
        else if (isupper(cipher[i])) {
            cipher[i] = (cipher[i]-'A'+shift)%26+'A';
        }
    }

    cipher[size] = '\0';
    cout << cipher << endl;
}
于 2012-12-04T18:07:14.087 に答える
0

いくつかのこと:

  1. 文字かどうかislowerを確認してから、ASCII 値が かどうかを確認しています> 122。これは決して真実ではありません。デフォルトのロケール (標準 ascii) ではislower()、ascii 値が [97, 122] (az) の範囲にある場合にのみ true になります。についても同様です isupper()。65 から 90 までの ASCII 値に対してのみ true を返します。
  2. とにかく、すでに ascii 値を使用しているためislower()isupper()冗長である可能性があります。これらは、範囲の境界チェックを行うことと同じtext[i] >= 97 && text[i] <= 122です。これらは便利なショートカットですが、簡略化できる場合は、コードをそれらに基づいて作成しないでください。
  3. 値が <= 90/122 の場合、コードはシーザー シフトを追加しないため、何もシフトしません。
于 2012-12-04T17:39:30.737 に答える