2016-03-27 34 views
-5

该程序的应该要求用户3个选项:C++运行终止的std :: out_of_range

1加密 2解密 3至退出

用于加密第一个步骤是要求一个纯文本要加密,程序就会越过。

下一步是要求加密/解密代码,当我把东西是在错误出现

From Code Blocks 16.01

下面是完整的代码:

#include bits/stdc++.h 

#include stdio.h 


using namespace std; 

void encrypt001(); 

void decrypt001(); 


string yes; 

string inname; 

string key; 

string alphabets="abcdefghijklmnopqrstuvwxyz"; 

int size=0; 

int y; 

int main() 

{ 

    int useroption; 

    do 

    { 
     cout<<"*****ENIGMA****"<<endl; 
     cout<<"[1] - Encrypt"<<endl; 
     cout<<"[2] - Decrypt"<<endl; 
     cout<<"[3] - Exit"<<endl; 
     cout<<"Enter Choice:"<<endl; 
     cin>>useroption; 

     switch (useroption) 
     { 
      case 1: 
       encrypt001(); 
       break; 
      case 2: 
       decrypt001(); 
       break; 
      default: 
       cout<<"Exit"<<endl; 
       break; 



     } 

    } 


    while (useroption!=3); 

} 



void encrypt001() 


{ 


    cout<<"*****ENCRYPTION******"<<endl; 


    string encrypt; 

    string ekey; 
    cin.ignore(); 

    cout<<"Enter Plain Text To Encrypt:"<<endl; 
    getline(cin,encrypt); 
    cout<<"Enter Encryption Key:"<<endl; 
    cin>>ekey; 

    int elen=encrypt.length(); 
    int ekeylen=ekey.length(); 
    int letterslen=alphabets.length(); 
    int num; 

    int y=0; 

    for (int x=0; x<elen; x++) 
    { 
     for (int h=0; h<letterslen; h++) 
     { 
      if (ekey.at(y)==alphabets[h]) 
      { 
       num=h; 
      } 
     } 


    int num1=0; 
    int num2=0; 

    string space; 
    space=encrypt.at(x); 

    if (space==" ") 
    { 
     continue; 
    } 

    for (int j=0; j<letterslen; j++) 
    { 
     if (encrypt[x]==alphabets[j]) 
     { 
      num1=j; 
     } 
    } 
    num2=num+num1; 

    if (num2>25) 
    { 
     num2=num2-26; 
    } 

    string letterrep; 
    letterrep=alphabets.at(num2); 
    encrypt.replace(x, 1, letterrep); 

    y++; 

    if (y>ekeylen) 
    { 
     y=0; 
    } 
    } 
    cout<<"Encrypted Cipher Text:"<<encrypt<<endl; 
    cout<<"Save To File? (y/n)"<<endl; 
    cin>>yes; 

    if (yes=="y") 
    { 
     cout<<"Enter File Name:"<<endl; 
     cin>>inname; 
     cout<<inname<<".txt saved succcessfully."<<endl;   
    } 
    else 
    { 
     cout<<"Proceed"<<endl; 
    } 
} 

void decrypt001() 
{ 
    cout<<"*****DECRYPTION*****"<<endl; 

    string decrypt; 
    string dkey; 
    string output; 
    cin.ignore(); 

    cout<<"Enter Cipher Text to Decrypt:"<<endl; 
    getline(cin, decrypt); 
    cout<<"Enter Decryption Key:"<<endl; 
    cin>>dkey; 

    int dlen=0; 
    int dkeylen=0; 

    for (int k=0; k<decrypt.length(); k++) 
    { 
     if (decrypt[dlen]!=' ') 
     { 
      output+=((((decrypt[dlen]-97)+26)-(dkey[dkeylen]-97))%26)+97; 
      dkeylen++; 
      dlen++; 
      if (dkeylen==dkey.length()) 
      { 
       dkeylen=0; 
      } 
     } 
     else if (decrypt[dlen]==' ') 
     { 
      output+=" "; 
      dlen++; 
     } 
    } 
    cout<<"Decrypted Plain Text:"<<output<<endl; 

} 

对不起第一部分格式化,我没有足够的声望发布多个链接。

解密部分工作得很好。

错误是:

终止所谓的std :: out_of_range

+1

对不起,你不会得到这份工作。 –

+0

什么?怎么样?为什么? – QWERTYKL

+0

他们在stackoverflow.com上找到此帖子。 –

回答

0

替换:

if (y>ekeylen) 
{ 
    y=0; 
} 

通过

if (y>=ekeylen) 
{ 
    y=0; 
} 
+0

先生,你不知道你帮了我多少,我希望我能偿还你,但我没有信用卡。 这正是我所需要的,一个奇迹,而你的先生是一名奇迹工人。 你应该为自己感到骄傲。 – QWERTYKL

0

看一看this网站上的std :: FUNC的载体更多信息。

0

C中的数组和矢量指数++从0到规模经营 - 1,因此,当你说

Int ellen = encrypt.Length 

后来

if (y>ekeylen) 
{ 
    y=0; 
} 

您正试图访问一个过去的矢量加密结束。 at成员函数然后抛出一个从未被捕获的std :: out_of_range类型的异常,并且因此你的程序终止。

它看起来好像你想找到与加密输入相对应的向量索引;你可以这样做。 std::find and std::distance如下:

num = std::distance(planet.begin(), std::find(encrypt.begin(), encrypt.end(), c0Encrypt)); 这将返回encrypt.size()如果Encrypt没有找到。但是,它很可能是更好的实现整个事情有std::map.

STD,LOL

+0

抱歉没有正确格式。 – 2016-03-27 22:54:13

+0

以下更简单的解释。 – 2016-03-27 22:59:37

相关问题