[Пошаговое руководство по коду] Как удалить все вхождения данного символа из строки в C? - PullRequest
0 голосов
/ 07 мая 2020

После прочтения кода на главный ответ здесь ,
у меня есть пара вопросов, ПОЧЕМУ этот ответ успешно работает, как и должно быть.
Я прошел через себя к этому коду, но до сих пор не знаю, ПОЧЕМУ str достигает ожидаемой строки.
У меня НЕТ достаточно репутации, чтобы оставлять комментарии к этому ответу, поэтому я решил открыть новый вопрос.

Ниже код предоставлен @ dasblinkenlight . (Я изменил ввод string в целях тестирования.)

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

Итак, в моем понимании, это пошаговое выполнение кода.

В line 1 оба *pr и *pw указывают на первый элемент ввода string
*pr ==> 'a'
*pw ==> 'a'

Внутри while l oop.
Результат будет разделен | на итерацию.
(1-я итерация) (2-я итерация) (3-я итерация) (4-я итерация)
*pr (строка 3) ====== ==> 'a' | 'b' | 'c' | 'd'
*pw = *pr++ (строка 4) ==> 'a' = 'b' | 'b' = 'c' | 'c' = 'd' | 'c' = '\0'
(*pw != c) (строка 5) ==> 'b' != 'c' (true) | 'c' != 'c' (ложь) | 'd' != 'c' (верно) | '\0' != 'c' (истина)
pw (после, pw += (*pw != c)) ==> str[1], 'b' | str[1], 'c' | str[2], 'c' | str[3], 'd'

Итак, теперь, если мое прохождение верное, у меня должно быть str со значением bd.
Однако, запустив это в редакторе кода, он вернет мне ожидаемый ответ: abd.

Я дважды проверил свой обход с помощью редактора, поэтому я почти уверен в изменениях значений в каждой переменной.
Если вы можете помочь понять, почему str заканчивается значением abd, дайте мне знать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...