代码没有在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 ö)

我认为这是一个学术练习没有人会使用递归来实现这项任务(他们也不会使用幻数、被称为<bits/stdc++.h>的瘟疫、垃圾"竞争性"编程网站上常见的可怕的做法等(

也就是说,学生在学习递归时犯的一个非常常见的错误是没有意识到通过返回值传递结果的函数需要从递归调用中获取。你成了这个错误的牺牲品。

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

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返回一个char(或者至少它声称返回(。但在反复出现的情况下,你不会得到这样的结果。事实上,您不会返回任何。这不仅是一个逻辑错误,还会导致未定义的行为。任何调用此函数以获取其结果并且没有立即落入其他两个目标退出条件之一的人都将没有指定的结果。如果你注意它的警告,你的编译器会告诉你这一点:

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

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

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
}

相关内容

  • 没有找到相关文章

最新更新