我目前正在尝试实现一个替换密码,由于某种原因不断崩溃,代码是相当直接的,但我一直遇到问题我相信起源于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;
答案 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;
}