FluffyCat
FluffyCat

Reputation: 65

[Code Walkthrough]How to remove all occurrences of a given character from string in C?

After reading the code on the top answer here,
I have a couple of questions WHY this answer successfully works as it should be.
I have walked through myself to this code, but still do not know WHY str achieves to get the expected string.
I DO NOT have enough reputation to leave comments on this answer, so I decided to open a new question.

The following is the code provided by @dasblinkenlight. (I changed the input string for testing purposes.)

void remove_all_chars(char* str, char c) {
    char *pr = str, *pw = str;           // line 1
                                         // Inside the while loop
    while (*pr) {                        // line 3
        *pw = *pr++;                     // line 4
        pw += (*pw != c);                // line 5
        printf("str: %s\n", str);       // FYI, this will always print `abcd`, isn't it weird, if `str` is mutated in the end of this program?
    }
    *pw = '\0';
}

int main() {
    char str[] = "abcd";
    remove_all_chars(str, 'c');
    printf("'%s'\n", str);
    return 0;
}

So, this is the walk through of the code, in my understanding.

In line 1, both *pr and *pw are pointing to the first element of the input string
*pr ==> 'a'
*pw ==> 'a'

Inside the while loop.
The result will be separated by | per iteration.
                                        (1st iteration)   (2nd iteration)   (3rd iteration)   (4th iteration)
*pr (line 3) ========>  'a'                   |  'b'                     |  'c'                   |  'd'                     
*pw = *pr++ (line 4) ==> 'a' = 'b'         | 'b' = 'c'           | 'c' = 'd'           | 'c' = '\0'           
(*pw != c) (line 5) ==> 'b' != 'c' (true)| 'c' != 'c' (false)| 'd' != 'c' (true) | '\0' != 'c' (true)
pw(after, pw += (*pw != c)) ==> str[1], 'b' | str[1], 'c' | str[2], 'c' | str[3], 'd'

So now, if my walkthrough is correct, I should have str, with the value of bd.
However, running this on the code editor, it will give me back the expected answer which is abd.

I double-checked my walk through with editor, so I am pretty sure in the changes of values in each variable.
If you can help with understanding why str ends up with the value of abd, please let me know.

Upvotes: 0

Views: 53

Answers (1)

Whats tipping you off is line 4. You can think of this line as two lines:

new line 4: *pw = *pr;

new line 5: pr++;

This means that when pw is pointing to 'a' it will be overwritten by 'a' which is what pr is currently pointing at, not 'b'. In your walkthrough you have 'a' = 'b'. The correct version would be 'a' = 'a' and then pr advances to 'b'. Do a walkthrough with the two lines of code I provided and you will understand it better.

Upvotes: 2

Related Questions