gpt4 book ai didi

c++ - 尝试创建一个基本的 "encrypter"

转载 作者:行者123 更新时间:2023-12-04 08:02:06 24 4
gpt4 key购买 nike

这是一个简单的概念,不是很安全,但只是一个练习类(class),因为我是一个非常早的初学者(2 到 3 周)
我基本上想在每个字母后的输入消息中插入随机数量的随机字符,如数字和表达式。因此,例如, “HELLO” 将成为 “ħ 45 ë [./43 大号/54 大号 43 [] ö”。
然而,我似乎只是找回了确切的输入,而没有在两者之间添加行话。有任何想法吗?
这是我的代码:

#include <iostream>
#include <ctime>
#include <string>


std::string encryptFunc(std::string address){

int i = 0;
int store = address.length();

std::string Output;


while(i < store){

if(address[i] == ' ' || address[i] == 'a' || address[i] == 'b' || address[i] == 'c' || address[i] == 'd' || address[i] == 'e' || address[i] == 'f' || address[i] == 'g' || address[i] == 'h' || address[i] == 'i' || address[i] == 'j' || address[i] == 'k' || address[i] == 'l' || address[i] == 'm' || address[i] == 'n' || address[i] == 'o' || address[i] == 'p' || address[i] == 'q' || address[i] == 'r' || address[i] == 's' || address[i] == 't' || address[i] == 'u' || address[i] == 'v' || address[i] == 'w' || address[i] == 'x' || address[i] == 'y' || address[i] == 'z' || address[i] == 'A' || address[i] == 'B' || address[i] == 'C' || address[i] == 'D' || address[i] == 'E' || address[i] == 'F' || address[i] == 'G' || address[i] == 'H' || address[i] == 'I' || address[i] == 'J' || address[i] == 'K' || address[i] == 'L' || address[i] == 'M' || address[i] == 'N' || address[i] == 'O' || address[i] == 'P' || address[i] == 'Q' || address[i] == 'R' || address[i] == 'S' || address[i] == 'T' || address[i] == 'U' || address[i] == 'V' || address[i] == 'W' || address[i] == 'X' || address[i] == 'Y' || address[i] == 'Z'){


srand(time(NULL));

int randJargonSelect = rand()%26; //which character of individual jargon is currently selected to be placed

char jargonSelection[] = {'1','2','3','?', '<', '~', '@', '/', '#', '+', '*', '&', '^', '%', '$', '!', '-', '0', '9', '8', '7', '6', '5', '4', '`', '|' };

char randPlacementJargon = jargonSelection[randJargonSelect]; //the variable holder for the character of jargon to place

int randJargonAmount = rand()%500; //the amount of jargon chars to place

Output = address[i], randPlacementJargon * randJargonAmount;

}


std::cout << Output;

i++;

};

std::string nada = " ";

return nada;

}


int main(){

std::string userin;

std::cout << "Please enter the message you wish to encrypt" << std::endl;
std::cout << "Enter here: "; std::getline(std::cin, userin);
std::cout << " " << std::endl;
std::cout << "Here is your Encoded Message: " << encryptFunc(userin) << std::endl;
std::cout << " " << std::endl;
system("pause");

return 0;

}
再次感谢。我知道可能有 100 种更好的方法可以做到这一点,但我只是为了学习而想了解它。

最佳答案

首先,让我们谈谈风格。您的代码的外观对于可读性极其重要,不仅对您自己,而且对其他人。有一些工具可以为您设计代码样式,例如 clang-format。这是您的代码,唯一的变化是我通过设置为 Google 样式的 clang-format 运行您的代码。我选择这种风格是因为它看起来很适合在这个网站上展示。
无论您是否使用工具,了解并使用良好且一致的风格都很重要。

#include <ctime>
#include <iostream>
#include <string>

std::string encryptFunc(std::string address) {
int i = 0;
int store = address.length();

std::string Output;

while (i < store) {
if (address[i] == ' ' || address[i] == 'a' || address[i] == 'b' ||
address[i] == 'c' || address[i] == 'd' || address[i] == 'e' ||
address[i] == 'f' || address[i] == 'g' || address[i] == 'h' ||
address[i] == 'i' || address[i] == 'j' || address[i] == 'k' ||
address[i] == 'l' || address[i] == 'm' || address[i] == 'n' ||
address[i] == 'o' || address[i] == 'p' || address[i] == 'q' ||
address[i] == 'r' || address[i] == 's' || address[i] == 't' ||
address[i] == 'u' || address[i] == 'v' || address[i] == 'w' ||
address[i] == 'x' || address[i] == 'y' || address[i] == 'z' ||
address[i] == 'A' || address[i] == 'B' || address[i] == 'C' ||
address[i] == 'D' || address[i] == 'E' || address[i] == 'F' ||
address[i] == 'G' || address[i] == 'H' || address[i] == 'I' ||
address[i] == 'J' || address[i] == 'K' || address[i] == 'L' ||
address[i] == 'M' || address[i] == 'N' || address[i] == 'O' ||
address[i] == 'P' || address[i] == 'Q' || address[i] == 'R' ||
address[i] == 'S' || address[i] == 'T' || address[i] == 'U' ||
address[i] == 'V' || address[i] == 'W' || address[i] == 'X' ||
address[i] == 'Y' || address[i] == 'Z') {
srand(time(NULL));
int randJargonSelect =
rand() % 26; // which character of individual jargon is currently
// selected to be placed
char jargonSelection[] = {'1', '2', '3', '?', '<', '~', '@', '/', '#',
'+', '*', '&', '^', '%', '$', '!', '-', '0',
'9', '8', '7', '6', '5', '4', '`', '|'};
char randPlacementJargon =
jargonSelection[randJargonSelect]; // the variable holder for the
// character of jargon to place
int randJargonAmount =
rand() % 500; // the amount of jargon chars to place
Output = address[i], randPlacementJargon * randJargonAmount;
}
std::cout << Output;
i++;
};
std::string nada = " ";
return nada;
}

int main() {
std::string userin;

std::cout << "Please enter the message you wish to encrypt" << std::endl;
std::cout << "Enter here: ";
std::getline(std::cin, userin);
std::cout << " " << std::endl;
std::cout << "Here is your Encoded Message: " << encryptFunc(userin)
<< std::endl;
std::cout << " " << std::endl;

return 0;

现在,让我们看看您的代码。我将从 main 函数开始,因为它更小。这里有两件小事,一件可以说是有些主观的。 std::cout << " " << std::endl; 行完全没有必要。如果您只想要一个空行,请打印 '\n'(换行符)。而且您也不需要完整的声明,只需将其粘贴在下一个实际 cout 的开头即可。 std::cout << "\nHere is your Encoded Message: " << ... 。第二件事是比 '\n' 更喜欢 std::endlstd::endl 做两件事,打印 '\n' 并刷新流。您不必经常冲洗流。
这是您的主要笔记,但它转换了我们。您尝试打印 encryptFunc() 的结果,但它返回一个空格,即您在函数末尾声明并返回的空格。你的函数也会打印,这很糟糕。
函数的目的应该是单一的。您将其命名为 encryptFunc() ,而不是 encryptAndPrintFunc() 。您也不需要使用任何形式的“func”来命名您的函数。我们都知道这是一个函数。而且你并没有真正加密,我会说它更像是填充,所以我要更改名称。
我们也看看参数名,地址。这是没有意义的。您不是在传递地址,而是在传递要编码的消息。我们将更改该名称,我选择消息。 std::string pad(std::string message) { ... }所以我们有了这个,而且你的代码打算做什么已经更容易理解了。
我要将 Output 重命名为 output 。以大写字母开头的名称通常保留给类/结构。您想在空格或字母后填充。你的 if 有一个庞大的 bool 表达式。我们将把这个循环改为 for 循环,并使用库 <cctype> 简化事情。这是一个很棒的 ASCII 工作库。如果您不知道 ASCII 是什么,请查找 ASCII 表。对于初学者编程的东西,ASCII 很棒。循环更改意味着我们不需要 i(无论如何都不是您使用它的方式)或存储。
std::string pad(std::string message) {
std::string output;

for (auto c : message) {
if (std::isalpha(c) || std::isspace(c)) {

// Still working
我使用的 for 循环是基于范围的 for 循环。 i 的值将是 char 的每个 message 。接下来,我们将为 C++ 版本更改旧的 C 样式随机数内容。这涉及 <random>
std::string pad(std::string message) {
std::string output;
const std::string jargon("123456790?<>~@/#+*&^%$!-`|");
static std::mt19937 prng(std::random_device{}());
static std::uniform_int_distribution<std::size_t> jargonSelector(
0, jargon.length() - 1);
static std::uniform_int_distribution<int> numJargon(1, 5);

for (auto c : message) {
if (std::isalpha(c) || std::isspace(c)) {

// Still working
关键字 static 用于多次调用此函数的情况。如果是这种情况,您不想不断地重新初始化您的伪随机数生成器或分布。 static 是我们实现这一目标的方式。 const 确保 jargon 永远不会被修改。
现在,我们正在处理您的代码的实际问题。这一行: output = message[i], randPlacementJargon * randJargonAmount; 不符合您的预期。 comma operator 执行第一个表达式,丢弃结果,并返回第二个表达式的结果。因此,您将输出保存为单个字符,然后进行了未保存在任何地方的随机乘法。这就是为什么再次打印原始字符串的原因,您的函数一次只打印一个字符。
如果您在启用警告的情况下进行编译,您可能已经知道该语句没有按预期工作。 -Wall -Wextra 应该被认为是强制性的。让编译器帮你。
这是完整的程序:
#include <iostream>
#include <random>
#include <string>

std::string pad(std::string message) {
std::string output;
const std::string jargon("123456790?<>~@/#+*&^%$!-`|");
static std::mt19937 prng(std::random_device{}());
static std::uniform_int_distribution<std::size_t> jargonSelector(
0, jargon.length() - 1);
static std::uniform_int_distribution<int> numJargon(1, 5);

for (auto c : message) {
if (std::isalpha(c) || std::isspace(c)) {
int padSize = numJargon(prng);
output.push_back(c);
for (int i = 0; i < padSize; ++i) {
output.push_back(jargon[jargonSelector(prng)]);
}
}
};

return output;
}

int main() {
std::string userin;

std::cout << "Please enter the message you wish to encrypt" << '\n';
std::cout << "Enter here: ";
std::getline(std::cin, userin);
std::cout << "\nHere is your Encoded Message: " << pad(userin) << '\n';
std::cout << " " << '\n';

return 0;
}
一旦确定一个字符是字母或空格(值得注意的是 std::isspace 对任何空白字符都返回 true):确定 pad 的大小,将原始字母推回输出,然后一个小循环将 pad 推回大小的“行话”字符。
在函数结束时,返回对象 output 而不是您返回的单个空格空字符串。我还从函数中删除了打印语句,因为那不是函数的工作。
这是一个示例输出:
Please enter the message you wish to encrypt
Enter here: Hello World!

Here is your Encoded Message: H@32e~/l94l%-4o5`> ?#W/o*5!r>!l&+@d15~3

关于c++ - 尝试创建一个基本的 "encrypter",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66408800/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com