大小写字符串加密解密,基本密码c++
upper and lowercase string encryption and decryption, basic cipher c++
#include<iostream>
#include<string>
#include<array>
#include<locale>
using namespace std;
class endeMachine
{
public:
int findIndex(char letter)
{
int index = 0;
while (letter != alphabet[index])
{
index++;
}//end while letter test
return index;
}//findIndex
string subEncrypt(string clear)
{
string subString = clear;
for (int i = 0; i < clear.length(); i++)
{
subString[i] = substitution[findIndex(clear[i])];
}//end for
return subString;
}//subEncrypt
string transEncrypt(string clear)
{
string subString = clear;
for (int i = 0; i < clear.length(); i++)
{
subString[i] = alphabet[findIndex(clear[i]) + offset];
}//end for
return subString;
}//transEncrypt
private://---------------------------------------------------------
array<char, 26> alphabet = { 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z' };
array<char, 26> substitution = { 'm','l','k','j','i','h','g','f','e','d','c','b','a','z','y','x','w','v','u','t','s','r','q','p','o','n' };
int offset = 3;
};//end endoMachine
int main()
{
endeMachine text;
string clear_text = { "Hello" };
cout << text.subEncrypt(clear_text) << endl;
cout << text.transEncrypt(clear_text) << endl;
cin >> clear_text;
}//end main
所以在这个程序中,我试图最终达到它可以做到的程度:
- 加密最终用户输入的字符串
- 选择加密的替代或置换方法
- 解密之前加密的字符串post-entry
- 选择其中一种加密方法
- 在不知道加密方法的情况下解密加密字符串,从而生成所有可能的结果
我的问题是:
当输入字符串包含大写字母时,整个程序关闭。但是,如果我在第 12 行中执行以下操作:
while (tolower(letter) != alphabet[index])
两种加密方法都有效,但 return 原始输入单词的严格小写版本,使得 "Hello" 的输入结果为:
fibby
knoor
输出时,而不是:
Fibby
Knoor
这意味着在某种程度上,我需要单独检查单词中每个字母的大小写,因此在输出时,可以将加密字符串对应的字母大写,然后再输出到屏幕。
请帮忙!!!
如果传递大写字符,您的 findIndex
函数将失败。
原因是它使用了下面的常量数组:
array<char, 26> alphabet = { 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z' };
array<char, 26> substitution = { 'm','l','k','j','i','h','g','f','e','d','c','b','a','z','y','x','w','v','u','t','s','r','q','p','o','n' };
所以它不会找到大写字母的匹配项,而你的 while 循环意味着你返回的索引值将超出范围....这比你的数组大小多 1。
您可以:
- 检查字符是否为大写
- 转换为小写
- 通过您的函数正常处理
- 如果是大写,则将加密字符设置为大写
...我猜是反向重复解密。
有一些丑陋而优雅的方法来检查字符是否为大写...
丑:
转成小写和原来的比较..它们一样吗?如果不是,则 Original 为大写。这可能在类似的语言中更具可移植性。 tolower函数here.
优雅:
char 值(对于普通英语)大写字符介于 65 和 90 之间,包括 65 和 90。您可以检查此范围内的 char 值
#include<iostream>
#include<string>
#include<array>
#include<locale>
using namespace std;
class endeMachine
{
public:
int findIndex(char letter)
{
int index = 0;
while (letter != alphabet[index])
{
index++;
}//end while letter test
return index;
}//findIndex
string subEncrypt(string clear)
{
string subString = clear;
for (int i = 0; i < clear.length(); i++)
{
subString[i] = substitution[findIndex(clear[i])];
}//end for
return subString;
}//subEncrypt
string transEncrypt(string clear)
{
string subString = clear;
for (int i = 0; i < clear.length(); i++)
{
subString[i] = alphabet[findIndex(clear[i]) + offset];
}//end for
return subString;
}//transEncrypt
private://---------------------------------------------------------
array<char, 26> alphabet = { 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z' };
array<char, 26> substitution = { 'm','l','k','j','i','h','g','f','e','d','c','b','a','z','y','x','w','v','u','t','s','r','q','p','o','n' };
int offset = 3;
};//end endoMachine
int main()
{
endeMachine text;
string clear_text = { "Hello" };
cout << text.subEncrypt(clear_text) << endl;
cout << text.transEncrypt(clear_text) << endl;
cin >> clear_text;
}//end main
所以在这个程序中,我试图最终达到它可以做到的程度:
- 加密最终用户输入的字符串
- 选择加密的替代或置换方法
- 解密之前加密的字符串post-entry
- 选择其中一种加密方法
- 在不知道加密方法的情况下解密加密字符串,从而生成所有可能的结果
我的问题是:
当输入字符串包含大写字母时,整个程序关闭。但是,如果我在第 12 行中执行以下操作:
while (tolower(letter) != alphabet[index])
两种加密方法都有效,但 return 原始输入单词的严格小写版本,使得 "Hello" 的输入结果为:
fibby
knoor
输出时,而不是:
Fibby
Knoor
这意味着在某种程度上,我需要单独检查单词中每个字母的大小写,因此在输出时,可以将加密字符串对应的字母大写,然后再输出到屏幕。
请帮忙!!!
如果传递大写字符,您的 findIndex
函数将失败。
原因是它使用了下面的常量数组:
array<char, 26> alphabet = { 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z' };
array<char, 26> substitution = { 'm','l','k','j','i','h','g','f','e','d','c','b','a','z','y','x','w','v','u','t','s','r','q','p','o','n' };
所以它不会找到大写字母的匹配项,而你的 while 循环意味着你返回的索引值将超出范围....这比你的数组大小多 1。
您可以:
- 检查字符是否为大写
- 转换为小写
- 通过您的函数正常处理
- 如果是大写,则将加密字符设置为大写
...我猜是反向重复解密。
有一些丑陋而优雅的方法来检查字符是否为大写...
丑:
转成小写和原来的比较..它们一样吗?如果不是,则 Original 为大写。这可能在类似的语言中更具可移植性。 tolower函数here.
优雅:
char 值(对于普通英语)大写字符介于 65 和 90 之间,包括 65 和 90。您可以检查此范围内的 char 值