代码未在 cpp 中返回正确的字符

code is Not returning the correct character in cpp

问题:字符串中第一个大写字母(递归) 疑问:为什么这段代码没有返回正确的字符,即使它在正确的时间输入 if 子句(当字母为大写时)。我添加这些 cout 语句仅用于调试目的。

# include <bits/stdc++.h>
using namespace std;
char UpperCase(string str, int i){
    
    cout<<" str "<<i<<" "<<str[i]<<endl;
    if(i==str.length()){
        return '0';
    }
    if(str[i]>=65 && str[i]<=90 ){
        char r=str[i];
        cout<<" r "<<i<<" "<<r<<endl;
        return r;
    }
    
    UpperCase(str, i+1);
}
int main(){
string str;
char r;
cout<<"Enter string : ";
cin>>str;
 r=UpperCase(str,0);
 cout<<r<<endl;
 return 0;
}

输出

Enter no of element : geeksforgeeKs
 str 0 g
 str 1 e
 str 2 e
 str 3 k
 str 4 s
 str 5 f
 str 6 o
 str 7 r
 str 8 g
 str 9 e
 str 10 e
 str 11 K
 r 11 K
ö

预计

K (instead of ö)

我假设这是一个学术练习。 没有人会实际使用递归来实现这个任务(他们也不会使用幻数,可怕的实践在垃圾上很常见”竞争”编程站点等)

也就是说,学生在学习递归时常犯的一个非常的错误是没有意识到 return-value 传递结果的函数需要从递归中获取称呼。你已经成为这里错误的受害者。

剥离调试语句,只看代码本身:

char UpperCase(string str, int i)
{
    if (i == str.length())
    {
        return '0';
    }
    if (str[i] >= 65 && str[i] <= 90)
    {
        return str[i];
    }

    UpperCase(str, i + 1); // <===== HERE
}

请注意 UpperCase return 是 char(或者至少它声称如此)。但在递归的情况下,你不会收获那个结果。事实上,您没有returning 任何东西。这不仅是一个逻辑错误,还会导致 未定义的行为。任何调用此函数以获取其结果并且 not 落入其他两个目标退出条件之一 immediately 的人都不会得到指定的结果。如果您注意它的警告,您的编译器会告诉您:

warning: control reaches end of non-void function [-Wreturn-type]

解决这个问题的最简单方法是记住您的函数应该做什么 return,然后确保它 return 是它。

char UpperCase(string str, int i)
{
    if (i == str.length())
    {
        return '0';
    }
    if (str[i] >= 65 && str[i] <= 90)
    {
        return str[i];
    }

    return UpperCase(str, i + 1); // <===== FIXED
}