0

我正在尝试使用 C++ 创建凯撒密码。我在文本文件中读取了程序,但我需要它来加密文本并输出到屏幕。

这是我的加密代码,但我似乎无法让它工作。我才刚刚开始使用 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

一些东西:

  1. 您正在检查字符islower,然后检查 ascii 值是否为> 122. 这永远不会是真的。在默认语言环境(标准 ascii)中,islower()只有当 ascii 值在 [97, 122] (az) 范围内时才会为真。也是如此 isupper()。它只对 65 到 90 之间的 ascii 值返回 true,包括 65 和 90。
  2. 无论如何,您已经在使用 ascii 值,因此islower()可能isupper()是多余的。这些等同于对范围进行边界检查,即text[i] >= 97 && text[i] <= 122. 它们是有用的快捷方式,但如果可以简化,请不要围绕它们编写代码。
  3. 如果值 <= 90/122,您的代码永远不会添加凯撒移位,因此您永远不会移动任何东西。
于 2012-12-04T17:39:30.737 回答
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 回答