C++ 在一对相同字符之间插入星号的递归程序
此代码中的错误是什么。我不知道。 如果我输入了C++ 在一对相同字符之间插入星号的递归程序,c++,recursion,C++,Recursion,此代码中的错误是什么。我不知道。 如果我输入了aaaa,abaa等等,它运行得非常完美。 但是当我输入scatter时,显示scatter@ 那么什么是完美的解决方案呢 输入字符串是aaaa。因此,输出是a*a*a而不是a*aa*a您不复制终止字符\0! 因此,当您插入一个字符时,字符串的终止是未定义的 还要注意,aaaa的正确答案应该是a*a*a(或a*aa*a,具体取决于问题定义) Split参数定义soruce和destination并使用单独的缓冲区 void copyAddStarTo
aaaa
,abaa
等等,它运行得非常完美。
但是当我输入scatter时,显示scatter@
那么什么是完美的解决方案呢
输入字符串是aaaa。因此,输出是
a*a*a
而不是a*aa*a
您不复制终止字符\0
!
因此,当您插入一个字符时,字符串的终止是未定义的
还要注意,aaaa
的正确答案应该是a*a*a
(或a*aa*a
,具体取决于问题定义)
Split参数定义soruce和destination并使用单独的缓冲区
void copyAddStarToPairs(const char*src,char*dst)
{
*dst=*src;
如果(!*dst)返回;
dst++;
char prev=*src++;
if(prev=*src)*dst++='*';
CopyAddStartPairs(src、dst);
}
您不能复制终止字符\0
!
因此,当您插入一个字符时,字符串的终止是未定义的
还要注意,aaaa
的正确答案应该是a*a*a
(或a*aa*a
,具体取决于问题定义)
Split参数定义soruce和destination并使用单独的缓冲区
void copyAddStarToPairs(const char*src,char*dst)
{
*dst=*src;
如果(!*dst)返回;
dst++;
char prev=*src++;
if(prev=*src)*dst++='*';
CopyAddStartPairs(src、dst);
}
可能是您应该使用std::string
,因为您的字符缓冲区可能不够长
#包括
使用std::string;
无效pairStar(字符串和s,int st){
如果(st>=(int)s.size()-1)
返回;
如果(s[st]==s[st+1]){
s+='';
对于(int i=(int)s.size()-1;i>st+1;i--)
s[i]=s[i-1];
s[st+1]='*';
st++;
}
佩尔斯塔(s,st+1);;
}
int main(){
字符串s=“aadqwedabbb*dqwdasd”;
对星(s,0);
cout可能您应该使用std::string
,因为您的字符缓冲区可能不够长
#包括
使用std::string;
无效pairStar(字符串和s,int st){
如果(st>=(int)s.size()-1)
返回;
如果(s[st]==s[st+1]){
s+='';
对于(int i=(int)s.size()-1;i>st+1;i--)
s[i]=s[i-1];
s[st+1]='*';
st++;
}
佩尔斯塔(s,st+1);;
}
int main(){
字符串s=“aadqwedabbb*dqwdasd”;
对星(s,0);
不能在input[1]='*';
行之后添加input[1]='\0';
实际发生的情况是,一旦附加“*”,就不会附加“\0”字符。这一行将把它附加到结尾,这意味着第一次调用的字符串在这里结束。递归函数也会这样做,它会在结尾添加“\0”字符,让您知道字符串在这里结束
举个例子:
aa是一个长度为2的字符串,在添加星号后,字符串的长度将变为3,因此输入[len+1]将被输入[2+1]=输入[3]。
因此,每次移动字符旁边的字符都将是“\0”字符
PS:这是我第一次在stackoverflow上添加答案…在input[len+1]='\0';
行之后添加input[1]='*';
实际发生的情况是,一旦附加“*”,就不会附加“\0”字符。这一行将把它附加到结尾,这意味着第一次调用的字符串在这里结束。递归函数也会这样做,它会在结尾添加“\0”字符,让您知道字符串在这里结束
举个例子:
aa是一个长度为2的字符串,在添加星号后,字符串的长度将变为3,因此输入[len+1]将被输入[2+1]=输入[3]。
因此,每次移动字符旁边的字符都将是“\0”字符
PS:这是我第一次在stackoverflow上添加答案…您似乎正在覆盖空终止符,而不是将其添加回数组末尾。改用std::string
如何?您似乎正在覆盖空终止符,而不是将其添加回数组末尾。使用std::string如何代码>相反?请您详细说明为什么应该进行这些更改,以便阅读您的答案的人能够更好地了解他们做错了什么?事实上,我对回答问题是新手。我尽可能多地解释了。谢谢。没关系。您的编辑确实改进了答案。请记住,帮助他人更好了解如何做一些正确的事情,而不仅仅是修复他们的代码。你能详细说明为什么应该进行这些更改,以便阅读你的答案的人能够更好地了解他们做错了什么吗?事实上,我对回答问题不熟悉。我尽可能多地解释了。谢谢。没关系。你的编辑真的改进了答案就是这样。请记住,帮助人们学习如何正确地做事比为他们修改代码要好。
void pairStar(char input[]) {
int len = strlen(input);
if(input[0] == '\0'){
return ;
}
if(input[0] == input[1]){
for(int i = len; i >= 2; i--){
input[i] = input[i-1];
}
input[2] = input[1];
input[1] = '*';
}
pairStar(input+1);
}