C++ C++;尝试递归返回字符串时出错
我在尝试编译时遇到此错误: “在抛出“C++ C++;尝试递归返回字符串时出错,c++,string,recursion,C++,String,Recursion,我在尝试编译时遇到此错误: “在抛出“std::out”的实例超出\u范围后调用terminate” what():basic\u string::at此应用程序已请求运行时 以一种不寻常的方式终止它。” 我猜这与程序中的单词.at()有关,但我似乎无法具体解释原因 string Recursive4(const string word) { string D; int num = word.length(); D.reserve(word.size()); D
std::out”的实例超出\u范围后调用terminate”
what()
:basic\u string::at
此应用程序已请求运行时
以一种不寻常的方式终止它。”
我猜这与程序中的单词.at()有关,但我似乎无法具体解释原因
string Recursive4(const string word)
{
string D;
int num = word.length();
D.reserve(word.size());
D += word.at(num);
num--;
if (word.at(0))
return D;
else
return Recursive4(word);
}
int main()
{
cout << Recursive4("Loyce") << endl;
}
字符串递归4(常量字符串字)
{
字符串D;
int num=word.length();
D.保留(字大小();
D+=字数(num);
num--;
if(单词at(0))
返回D;
其他的
返回递归4(word);
}
int main()
{
coutstring
,与几乎所有容器一样,使用零索引,因此最大元素索引为size-1
。您可以按如下方式更改代码:
string Recursive4(const string word)
{
string D;
int num = word.length() - 1;
D.reserve(word.size());
D += word.at(num);
num--;
if (word.at(0))
return D;
else
return Recursive4(word);
}
编辑:正如user657267指出的,string
确实返回了对null
字符的引用,如果您使用operator[]
获取索引size
处的元素word.at();
的位置必须小于word.size()
。您正在传递word.size()
length()
和size()
的意思完全相同。对于at
来说,这是正确的,但是word[word.size()]
对于C++11来说定义得很好,返回一个不可修改的空字符。这修复了错误,但现在它只输出“e”而不是字符串的其余部分,我猜是因为int num在每次递归调用过程中都会重新初始化?你们都怎么想?@livedebugger为什么不使用调试器?很抱歉,我只是无法理解调试器输出的信息。初始错误的解决方案已经修复,我非常感谢,现在唯一的问题是我的逻辑program@VividDebugger您在每次调用时都要创建一个新字符串D,并返回整个单词或单个字符word.at(num)
。您不应该将字符串D与原始单词一起传递吗?