抛出'std :: out_of_range'

时间:2016-02-06 19:05:00

标签: c++

我已经无数次地尝试解决这个问题,互联网上的任何内容都没有帮助。我认为问题出在“getline(cin,strg);”但我不知道是什么,如果我只使用“cin>> strg;”,程序运行完美,但是,我想要考虑空间和诸如此类的东西。有什么问题?

#include <iostream>
#include <stdlib.h>
using namespace std;

string alphabet = "abcdefghijklmnopqrstuvwxyza";
string alphacap = "AbcdEfghIjklmnOpqrstUvwxyzA";
int loc;

string code(string str) {
    for(int i = 0; i <= str.length()-1; i++){
        if(alphabet.find(str[i]) != str.npos){
            loc = alphabet.find(str[i]);
            str = str.substr(0,i) + alphacap[loc+1] + str.substr(i+1,str.length());
        }
    }
    return str;
}

string decode(string str) {
    for(int i = 0; i <= str.length()-1; i++){
        if(alphabet.find(str[i]) != str.npos){
            loc = alphabet.find(str[i]);
            str = str.substr(0,i) + alphacap[loc-1] + str.substr(i+1,str.length());
        }
    }
    return str;
}


int main() {
    string codc;
    do{
        system("cls");
        cout << "Code or Decode? ";
        cin >> codc;
    }while(codc != "code" and codc != "Code" and codc != "decode" and codc != "Decode");

    string str;

    if(codc == "code" or codc == "Code"){
        string strg;
        getline(std::cin,strg);
        cout << code(strg);
    }else{
        string strg;
        getline(cin,strg);
        cout << decode(strg);
    }

}

2 个答案:

答案 0 :(得分:0)

异常是由:

引起的
str.substr(i + 1, str.length());

因为它尝试访问str的元素,直至i + str.length()i > 0失败。查看原始Q&A

str.substr(i + 1, str.length() - i - 1);会纠正它。

如果你想获得索引i右侧的字符串部分,你可以省略第二个参数

str.substr(i + 1);

请参阅reference

这也很危险:

alphacap[loc + 1]
alphacap[loc - 1]

如果localphacap中第一个/最后一个元素的索引,该怎么办?

答案 1 :(得分:0)

getline(std::cin,strg) strg ==&#34;&#34; 循环中:      

for(int i = 0; i <= str.length()-1; i++)
如果str.length()== 0,则比较&lt; =无法正常工作 更改为

for(int i = 0; i <= (int)str.length()-1; i++)
程序不会失败。

也优选也改变     cin >> codc; 至     getline(cin,codc);

现在节目不会失败。