c ++中的加密问题

时间:2013-05-01 13:32:48

标签: c++ encryption

我目前正在尝试实现一个替换密码,由于某种原因不断崩溃,代码是相当直接的,但我一直遇到问题我相信起源于for循环或当我尝试读取数据时文件。

cout << "Ener a key :";
cin >> key;

cin.ignore();
cout << endl << "Enter input file name: ";
getline(cin,fileIn);

inputfile.open(fileIn.c_str(), ios::in);


cout << endl << "Enter output file name: ";
getline(cin,fileOut);
outfile.open(fileOut.c_str(), ios::app);

cout << endl << "[E]ncryption or [D]ecryption? :";
cin >> EorD;


//Encryption
if (EorD == "E" || "e")
{
    while(!inputfile.eof()) // Reading in file data, while not end of file.
    {
        getline(inputfile,plainText);
    }

        for (int i = 0; i <= plainText.length(); i++)
        {
        char letter = plainText.at(i);
        int val = (int)letter; // getting ascii value of each letter.
        int EnVal = (val - 32) + key;
            if(EnVal > 95)
            {
                EnVal = (EnVal - 95) + 32;

            }
        char EnLetter = static_cast<char>(EnVal);
        outfile <<  EnLetter;

2 个答案:

答案 0 :(得分:2)

您在plainText字符串中将一个索引循环过多。由于它有length()个条目,第一个条目是0,因此最后一个索引是length()-1。试试这个:

for (int i = 0; i < plainText.length(); i++)

如果plainText.at(i)太大,i会崩溃。

答案 1 :(得分:2)

变化

for (int i = 0; i <= plainText.length(); i++)

for (int i = 0; i <= plainText.length()-1; i++)

因为超出范围。更好地使用iterator

也改变了这个:

if (EorD == "E" || "e")

if (EorD == "E" || EorD == "e")

因为前者总是如此。

正如詹姆斯坎泽所指出的那样,不要使用std::string::at,你不需要它,把它改成std::string operator[]和我的建议:另外用你的代码覆盖你的代码try{}catch(...){}阻止

你可能会考虑这样的事情:

#include <vector>
#include <iterator>
#include <algorithm>

int key=100;
char op(char c){
    char letter = c;
        int val = (int)letter; // getting ascii value of each letter.
        int EnVal = (val - 32) + key;
            if(EnVal > 95)
            {
                EnVal = (EnVal - 95) + 32;

            }
        char EnLetter = static_cast<char>(EnVal);
        return EnLetter;
}
int main(){
    try{
       std::string s="piotrek";
       std::vector<char> vc_in(s.begin(),s.end());
       std::vector<char> vc_out;
       std::transform (vc_in.begin(), vc_in.end(), 
          std::back_inserter(vc_out), op); //this do the thing
       std::copy(vc_out.begin(), vc_out.end(),
          std::ostream_iterator<char> (std::cout,"_")); // to print
    }catch(std::exception& e){
       cout<<"exception: "<<e.what();
    }
    return OK;
}