2010-09-20 2 views
5

Я учу C. И я вижу, что эта функция находит длину строки.понимание функции strlen в C

size_t strlen(const char *str) 
{ 
size_t len = 0U; 
while(*(str++)) ++len; return len; 
} 

Теперь, когда выход петли? Я смущен, поскольку str ++ всегда увеличивает указатель.

+0

FYI: Читайте Кернингем и Ричи. Они ввели этот стиль программирования. Слово предосторожности, хотя никогда не использовать этот стиль в коммерческих приложениях. –

+0

У меня есть эта книга, но сначала используйте другие ресурсы, чтобы получить удобство с C :) – jess

+0

@ user439578: Что стиль (любой стиль) имеет отношение к типу приложения? Просто используйте стиль, который вам больше нравится, и 'indent' (с домашним стилем) перед отправкой кода. – pmg

ответ

10
  1. строки C заканчиваются на NUL характер, который имеет значение 0
  2. 0 в C false и все остальное true.

Таким образом, мы продолжаем увеличивать указатель на строку и длину, пока не найдем NUL, а затем вернемся.

+0

Я знал первый пункт. Второй дал понять! Спасибо – jess

+1

Я в порядке с вашим ответом, но для упоминания ASCII. Было бы лучше оставить это.'nul' гарантированно будет' 0' с любой кодировкой. –

+0

@Jens изменена согласно вашей рекомендации. – doron

11
while(*(str++)) ++len; 

такой же, как:

while(*str) { 
++len; 
++str; 
} 

такой же, как:

while(*str != '\0') { 
++len; 
++str; 
} 

Итак, теперь вы видите, когда str указывает на null полукокса в конце строки, проверка состояния терпит неудачу, и вы прекратите цикл.

+1

"такой же как:" за исключением окончательного значения 'str', но это не используется в этом случае. –

0

Как только *(str++) возвращает 0, петля выходит. Это произойдет, когда str указывает на последний символ строки (поскольку строки в C заканчиваются на 0).

2

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

1 °) Строка C представляет собой массив символов.

2 °) В C переменная массива на самом деле является указателем на первый случай таблицы.

Так что же делает strlen? Он использует арифметику указателя для синтаксического анализа таблицы (++ на указателе означает следующий случай), пока не дойдет до конечного сигнала («\ 0»).

+0

таблица символов? Вы имеете в виду массив символов? –

+1

Да. Я всегда делаю эту ошибку на английском языке (на французском языке мы говорим «таблица» для «массива», поэтому я склоняюсь к «таблице»). – Raveline

0

Правильно, str++ увеличивает счетчик и возвращает предыдущее значение. Звездочка (*) разделяет указатель, то есть дает вам значение символа.

C строки заканчиваются нулевым байтом. Цикл while завершается, когда условие больше не является истинным, а это значит, что оно равно нулю.

Так цикл while работает до тех пор, пока он не встретит нулевой байт в строке.

Смежные вопросы