strlen () для строки символов с ненулевым символом в конце? - PullRequest
27 голосов
/ 10 марта 2009

Определяется ли strlen(const char *s), когда s не заканчивается нулем, и если да, что он возвращает?

Ответы [ 10 ]

34 голосов
/ 10 марта 2009

Нет, это не определено. Это может привести к нарушению доступа к памяти, так как он будет продолжать считать, пока не достигнет первого байта памяти, значение которого равно 0.

9 голосов
/ 10 марта 2009

Из стандарта C99:

Функция strlen возвращает количество символов, предшествующих завершающий нулевой символ.

Если нет нулевого символа, это означает, что результат не определен.

5 голосов
/ 12 марта 2009

Может быть, вам нужно strnlen ?

2 голосов
/ 10 марта 2009

Если ваша строка не завершена NUL, функция будет продолжать поиск до тех пор, пока не найдет ее.

Если вам повезет, это приведет к сбою вашей программы.

Если вам не повезет, вы получите большую длину, чем ожидалось, с большим количеством «неожиданных» значений.

2 голосов
/ 10 марта 2009

Не совсем, и это вызовет плохих вещей .

1 голос
/ 10 марта 2009

не определено. Это вызывает неопределенное поведение, что означает, что все может произойти, скорее всего, ваша программа потерпит крах.

1 голос
/ 10 марта 2009

Будет возвращено количество символов, обнаруженных до того, как будет найдено \ 0.

0 голосов
/ 04 августа 2017

человек 3 strcspn

size_t strcspn (const char * s, const char * reject);

Длина строк, разделенных двоеточиями:

size_t len = strcspn(str, ":");

Длина строк, разделенных запятыми:

size_t len = strcspn(str, ",");

Длина строк с разделителями табуляции:

size_t len = strcspn(str, "\t");
0 голосов
/ 10 марта 2009

strlen () работает (делает что-то полезное) только для строк с нулевым символом в конце; вы получите совершенно неопределенный результат, если передадите что-нибудь другое. Если вам повезет, это не приведет к сбою:)

0 голосов
/ 10 марта 2009

Всегда определяется.

Он будет возвращать длину «строки», пока не достигнет байта с нулем в нем. Плохая идея, потому что это может вызвать переполнение буфера.

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