提问者:小点点

在一对相同字符之间插入星号的递归程序


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

这个代码中的错误是什么。 我找不到。 如果我输入aaaaabaa等,它运行完美。 但是当我输入scatter时,就会显示scatter*ter?@那么完美的解决方案是什么。


共2个答案

匿名用户

您不能复制终止字符\0! 因此,当您插入一个字符时,字符串的终止是未定义的。

还要注意,aaaa的正确答案应该是a*a*a*a(或a*aa*a,具体取决于问题定义)。

Split参数来定义soruce和destination,并使用单独的缓冲区。

void copyAddStarToPairs(const char *src, char *dst)
{
    *dst = *src;
    if (!*dst) return;
    dst++;
    char prev = *src++;
    if (prev = *src) *dst++ = '*';
    copyAddStarToPairs(src, dst);
}

匿名用户

您可能应该使用std::string,因为您的char缓冲区可能不够长。

#include <string>
using std::string;
void pairStar(string & s, int st) {
    if (st >= (int)s.size() - 1)
        return;
    else if (s[st] == s[st + 1]) {
        s += ' ';
        for (int i = (int)s.size() - 1; i > st + 1; i--)
            s[i] = s[i - 1];
        s[st + 1] = '*';
        st++;
    }
    pairStar(s, st + 1);
}

int main() {
    string s = "aadqwedabbbbb*dqwdasd";
    pairStar(s, 0);
    cout << s << endl;
}