大写和小写字符串加密和解密,基本密码c ++

时间:2017-12-15 23:56:49

标签: c++ encryption uppercase lowercase caesar-cipher

#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

所以在这个程序中,我试图最终达到可以的程度:

  • 加密最终用户输入的字符串
  • 选择加密的替换或转置方法
  • 解密先前在条目后加密的字符串
  • 选择其中一种加密方法来执行此操作
  • 在不知道加密方法的情况下解密加密字符串,从而生成所有可能的结果

我的问题是:

当输入字符串包含大写字母时,整个程序将关闭。但是,如果我在第12行做某事,比如:

while (tolower(letter) != alphabet[index])

加密方法都有效,但返回原始输入字的严格小写版本,输入&#34; Hello&#34;结果是:

fibby
knoor

输出时,而不是:

Fibby
Knoor

这意味着在某种程度上,我需要单独检查单词中每个字母的大小写,所以当输出到时,加密字符串的相应字母可以在输出到屏幕之前大写

请帮助!!!

1 个答案:

答案 0 :(得分:0)

如果传递了UPPER案例字符,您的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' };

因此它不会找到UPPER大小写字母的匹配项,而你的while循环意味着你返回的索引值将超出界限....这比你的数组大小多1个。

你可以:

  • 检查char是否为大写
  • 转换为小写
  • 正常处理您的功能
  • 如果它是大写的,则将加密的char设置为大写

...我想反过来重复解密。

有一种丑陋而优雅的方法可以检查字符是否为大写......

<强>丑:

转换为小写并与原始进行比较..它们是否相同?如果不是,原始是大写。这可能在类似语言中更容易移植。 tolower函数here

<强>优雅:

char值(对于普通英语)大写字符介于65和90之间。您可以检查此范围内的char值