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);
    
}