我正在创建一个程序,它将使用递归转换字符串。 该方法用" 1"替换所有出现的大写字符。所有出现的" o" 2和所有出现的" r"用a。
要求:递归函数应该只接受一个作为输入字符串的参数并返回转换后的字符串。
以下是我的代码:
#include<iostream>
#include<conio.h>
#include<string>
#include<string.h>
using namespace std;
int count=0;
string convert(string a)
{
int b=a.length();
if(b>=count)
{
if (isupper(a[b-(b-count)]))
{
a.replace(b-(b-count),1,"1");
convert(a);
}
else if (a[b-(b-count)]=='o')
{
a.replace(b-(b-count),1,"2");
convert(a);
}
else if(a[b-(b-count)]=='r')
{
a.replace(b-(b-count),1,"a");
convert(a);
}
}
else
return a;
}
void main()
{
string a;
a="ABCrroo";
int l=a.length();
cout<<convert(a);
getch();
}
答案 0 :(得分:1)
您已将convert()
定义为返回std::string
,但函数内部有四个位置,您可以进行递归调用,而不会对返回值执行任何操作。如果要将每个递归调用的结果传递回调用堆栈,则必须执行某些操作。
我modified your code并将四条裸convert(a);
行更改为return convert(a);
,并输出“212a212a212a”,我认为这是理想的结果。
看起来你正在使用一个超过字符串结尾的索引。条件if(b>=count)
将允许您的代码使用有效范围0..length-1
之外的索引。尝试将其更改为if(b>count)
。
答案 1 :(得分:0)
#include<iostream>
#include<string>
#include<string.h>
string convert1(string a, int pos);
using namespace std;
int count=0;
string convert1(string a, int pos)
{
if(pos < a.length())
{
if(isupper(a[pos])) a.replace(pos, 1, "1");
else if(a[pos]=='o') a.replace(pos, 1, "2");
else if(a[pos]=='r') a.replace(pos, 1, "a");
convert1(a, ++pos);
}
else return a;
}
int main()
{
string a="oYoroCoroSor";
cout << a << endl;
int l=a.length();
cout<< convert1(a, 0) << endl;
return 0;
}