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;
}