C++ 为什么使用c+时会出现超出范围的异常+;串

C++ 为什么使用c+时会出现超出范围的异常+;串,c++,string,outofrangeexception,C++,String,Outofrangeexception,代码得到类型超出范围的异常,我不知道为什么。当我调试它时,它似乎可以工作,字符串被转换成我想要的样子。 第一次堆栈溢出(顺便说一句:) #包括 使用名称空间std; 字符串s; 字符串alpha=“abcdefghijklmnopqrstuvxyz”; 字符串加密(string&s); int main() { cin>>s; 请考虑这种情况:如果s.length()

代码得到类型超出范围的异常,我不知道为什么。当我调试它时,它似乎可以工作,字符串被转换成我想要的样子。 第一次堆栈溢出(顺便说一句:)

#包括
使用名称空间std;
字符串s;
字符串alpha=“abcdefghijklmnopqrstuvxyz”;
字符串加密(string&s);
int main()
{
cin>>s;

请考虑这种情况:
如果s.length()

加密函数的内部循环可以将
i
增量超过字符串的结尾。没有停止它的测试

您可以通过在更改字母时中断循环来避免这种情况(这更正确,可能更快)。这意味着您应该在内部循环之外增加
i
,这意味着外部循环也可以是
for
循环

string crypto(string &s) {
  for (size_t i = 0; i < s.length(); ++i) {
    for (size_t j = 0; j < alpha.length(); ++j) {
      if (s.at(i) == alpha.at(j)) {
        s.at(i) = alpha.at(alpha.length() - 1 - j);
        break;
      }
    }
  }
  return s;
}
string加密(string&s){
对于(大小i=0;i
问题在于
i++
在错误的位置。您应该更好地格式化代码,这样更容易发现

还应避免使用非常量全局变量和
名称空间std

#include <iostream>
#include <string> //Include the headers you use

const std::string alpha="abcdefghijklmnopqrstuvwxyz";
void crypto(std::string &s);

int main(){

    std::string s;
    crypto(s);
    std::cout<<s;
    return 0;
}

void crypto(std::string &s) //If you take the string by reference, it is changed, so you do not have to return it
{   
    for(std::size_t i = 0; i < s.length(); ++i) { //The for loop avoids the mistake completely
      for(size_t j=0; j < alpha.length(); ++j){
        if(s.at(i)==alpha.at(j)){
          s.at(i)=alpha.at(alpha.length()-1-j);
        }   
      }
    }
}
#包括
#include//include您使用的标题
常量std::string alpha=“abcdefghijklmnopqrstuvxyz”;
无效加密(标准::字符串&s);
int main(){
std::字符串s;
加密软件;

std::cout未将
i++
放在正确的位置

此外,代码中还有另一个问题:一旦元素被替换,您必须立即离开内部循环(
break
)。否则,您可以在同一个循环中使用
a->z->a

输入

输出

zyxba
abcyz
#包括
#包括
std::string加密(std::string&s){
常量std::string alpha=“abcdefghijklmnopqrstuvxyz”;
对于(大小i=0;i>s;

std::cot请格式化代码以使其可读。
++i
放在不好的地方。在下一次
j
迭代中,您可能有一个越界访问我不明白。您正在修改参数并返回修改后的参数的副本。通常函数执行一个或另一个操作,而不是两个都执行。
zyxba
abcyz
#include <iostream>
#include <string>

std::string crypto(std::string& s) {
    const std::string alpha = "abcdefghijklmnopqrstuvwxyz";
    for (size_t i = 0; i < s.length(); ++i) {
        for (size_t j = 0; j < alpha.length(); j++) {
            if (s.at(i) == alpha.at(j)) {
                s.at(i) = alpha.at(alpha.length() - 1 - j);
                break;
            }
        }
    }
    return s;
}

int main() {
    std::string s;
    std::cin >> s;
    std::cout << crypto(s) << std::endl;
    std::cout << crypto(s) << std::endl;
    return 0;
}