代码未在 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
}
问题:字符串中第一个大写字母(递归) 疑问:为什么这段代码没有返回正确的字符,即使它在正确的时间输入 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
}