Не в состоянии понять эту программу C - PullRequest
1 голос
/ 12 марта 2019

Я новичок в программировании, не получаю код ниже.Эта программа проверяет, есть ли символ c в строке s.

int is_in(char *s, char c){
  while(*s){
    if(*s==c) return 1;
    else s++;
  return 0;
}

Главное, что меня смущает, это то, как цикл while остановится, так как, я думаю, s++ будет проходить через всю память, также и после конца строки.Кто-нибудь может объяснить это, пожалуйста?Пожалуйста, поправьте меня, если я ошибаюсь.

Ответы [ 3 ]

3 голосов
/ 12 марта 2019

Цикл останавливается, когда *s равен 0, то есть в конце строки, оканчивающейся NUL.

Идиоматическим способом моделирования строк в C является завершение их с 0Обратите внимание, что если s не сформирован таким образом, то поведение вашей функции будет undefined .

Лично я бы предпочел, чтобы эта функция была int is_in(const char *s, char c), чтобы обозначитьвызывающая сторона, что функция не изменяет строку.

1 голос
/ 12 марта 2019

Ваша интуиция о том, что указатель s будет продолжать цикл бесконечно, была бы правильной, если бы не две вещи:

  • Строки C завершаются нулевым символом (символ '\0'). Это действует как дозорное значение для функций, обрабатывающих строки; это необходимо, поскольку при передаче массива в функцию он распадается на указатель на свой первый элемент, теряя информацию о длине.
  • Условие цикла while(*s) будет ложным при достижении нулевого терминатора.

На самом деле, while(*s) { loop-body; s++; } - это хорошо известная идиома в Си для обработки строк.

0 голосов
/ 12 марта 2019

Строка char *s должна заканчиваться завершением NUL.Значение NUL равно нулю.Ноль - это то, что *s должно в конечном итоге "расшириться".

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