Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;尝试递归返回字符串时出错_C++_String_Recursion - Fatal编程技术网

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()
{

cout
string
,与几乎所有容器一样,使用零索引,因此最大元素索引为
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与原始单词一起传递吗?