Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Replacing character in a string [duplicate]

Possible Duplicate:
What is the function to replace string in C?

I am trying to replace a certain character in my string with multiple characters. Here is an example of what I am trying to do.

Say I have the string "aaabaa"

I want to replace all occurrences of the character "b" with 5 "c"s.

So when I am done, "aaabaa" becomes "aaacccccaa"

I have written the following code:

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

My output from this function is "aaaccccc". It appears that it just overwrites the last two a's with the c's. Is there any way I would have it so that these last couple of a's dont get overwritten?

like image 627
me45 Avatar asked Oct 15 '12 05:10

me45


2 Answers

If you want to do this in general, without worrying about trying to size your buffers, you should malloc a new string just large enough to hold the result:

/* 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;
}

Usage:

int main() {
    char *s = replace("aaabaa", 'b', "ccccc");
    printf("%s\n", s);
    free(s);
    return 0;
}
like image 116
nneonneo Avatar answered Sep 22 '22 05:09

nneonneo


Your problem is that you replace the "ccccc" into the original string thus overwriting the remaining characters after what you wish to replace... You should copy into a new string and keep track of two indices - one in each.

And be happy that you declared char s[20] larger than the size of your original string plus the replace values, as otherwise you'd have created a buffer overflow vulnerability in your critical login system :-)

Cheers,

like image 39
Anders R. Bystrup Avatar answered Sep 25 '22 05:09

Anders R. Bystrup