替换字符串中的字符

me4*_*e45 6 c string character

可能重复:
在C中替换字符串的功能是什么?

我试图用多个字符替换我的字符串中的某个字符.这是我想要做的一个例子.

说我有字符串"aaabaa"

我想用5"c"替换所有出现的字符"b".

所以,当我完成后,"aaabaa"变成"aaacccccaa"

我写了以下代码:

#include <stdio.h>
#include <string.h>
int main(void)
{
    char s[20] = "aaabaa";
    int i, j;
    for (i=0; s[i]!= '\0'; i++)
    {
        if (s[i] == 'b')
        {
            for (j=0; j<5; j++)
            {
                s[i+j] = 'c';
            }
        }
    }
    printf("%s\n", s);
}
Run Code Online (Sandbox Code Playgroud)

我从这个函数输出的是"aaaccccc".它似乎只是用c来覆盖最后两个a.我有没有办法让这些最后几个不被覆盖?

nne*_*neo 10

如果你想一般性地这样做,而不用担心尝试调整缓冲区的大小,你应该malloc有一个足够大的新字符串来保存结果:

/* return a new string with every instance of ch replaced by repl */
char *replace(const char *s, char ch, const char *repl) {
    int count = 0;
    const char *t;
    for(t=s; *t; t++)
        count += (*t == ch);

    size_t rlen = strlen(repl);
    char *res = malloc(strlen(s) + (rlen-1)*count + 1);
    char *ptr = res;
    for(t=s; *t; t++) {
        if(*t == ch) {
            memcpy(ptr, repl, rlen);
            ptr += rlen;
        } else {
            *ptr++ = *t;
        }
    }
    *ptr = 0;
    return res;
}
Run Code Online (Sandbox Code Playgroud)

用法:

int main() {
    char *s = replace("aaabaa", 'b', "ccccc");
    printf("%s\n", s);
    free(s);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)


And*_*rup 5

您的问题是您将"ccccc"替换为原始字符串,从而在您想要替换之后覆盖剩余字符...您应该复制到一个新字符串并跟踪两个索引 - 每个索引一个.

并且很高兴您声明char s[20]大于原始字符串的大小加上替换值,否则您在关键登录系统中创建了一个缓冲区溢出漏洞:-)

干杯,