我陷入了cpp的Caesar Cypher加密问题

问题描述 投票:0回答:1

单文件编程问题 问题陈述

您的任务是构建一个程序,使用指定的加密技术对秘密消息进行加密。加密技术涉及根据加密密钥将消息中的每个字符移动一定数量的位置。加密的消息将通过不安全的通道发送,并且只能由知道加密密钥的预期接收者解密。

函数名称:字符串加密字符串

输入格式: 第一行输入是一个要加密的字符串,str。

第二行输入由一个整数组成,n代表加密密钥。

输出格式: 输出显示问题陈述中所述的加密字符串。

代码限制: 1 <= Length of the string, str <= 100

1 <= n <= 5

示例测试用例:

输入1:

欢迎

2

输出1:

ygneqog

输入2:

你好@123

4

输出2: 嘴唇D567

我多次尝试解决这个问题,并且还借助了chatgpt等聊天机器人的帮助,我将我的代码交给了chatgpt,因为在我的代码中,一些隐藏的案例失败了 chatgpt 改进了我的代码,但现在也有一个隐藏的测试案例失败了,我不这样做不知道该特定案例的输入

这是我拥有的最好的代码

#include <iostream> 
#include <cstring> 
using namespace std;
string encryptString(string str, int n) 

{ 
int length = str.length();
for (int i = 0; i < length; ++i) {
    char ch = str[i];

    if (ch >= 'a' && ch <= 'z') {
        ch = ch + n;
        if (ch > 'z') {
            ch = ch - 'z' + 'a' - 1;
        }
        str[i] = ch;
    } else if (ch >= 'A' && ch <= 'Z') {
        ch = ch + n;
        if (ch > 'Z') {
            ch = ch - 'Z' + 'A' - 1;
        }
        str[i] = ch;
    } else if (ch >= 32 && ch <= 126) {
        ch = ch + n;
        if (ch > 126) {
            ch = ch - 95;
        }
        str[i] = ch;
    }
}
return str;

}

int main() {

cout << "Enter the message:" << endl; 
string msg; getline(cin, msg);

int key;
cout << "Enter key: ";
cin >> key;

string encryptedMsg = encryptString(msg, key);
cout << "Encrypted message: " << encryptedMsg << endl;

return 0;

}

我提供的代码失败了一个隐藏的案例,指导我使其更加健壮,以便它也能够处理该案例。

c++ encryption caesar-cipher
1个回答
0
投票

我们可以假设消息仅包含字母字符、“A”-“Z”和“a”-“z”吗?

否则,也许只加密

str
中那些字母字符就可以了。这就是我在快速测试程序中所做的。

有了这些提示,技巧如下:

  1. 将每个字符转换为从零开始的等效字符
  2. 添加加密密钥
  3. 将结果取模 26(即字母表的大小)。为此请使用
    ch % 26
  4. 转换回字符。

将每个字符转换为从零开始的等效字符

此步骤取决于字符集中彼此相邻的字母。对于 ASCII 字符来说是这样,但对于其他字符集则不一定。

通过减去大写字母“A”或小写字母减去“a”来转换为从零开始。

通过为大写字母添加“A”或为小写字母添加“a”来转换回常规字符。

剩下的就很明显了。

我有一个工作程序,但我不会将其发布在这里。我希望您能通过自己编码获得奖励。

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.