После прочтения кода на главный ответ здесь ,
у меня есть пара вопросов, ПОЧЕМУ этот ответ успешно работает, как и должно быть.
Я прошел через себя к этому коду, но до сих пор не знаю, ПОЧЕМУ 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
, дайте мне знать.