LINUX.ORG.RU

strlen(NULL);


0

0

есть ли реализация библиотеки стандартных функций, где strlen(NULL) возвращает 0 а не segmentation fault ?

anonymous

if(p) return strlen(p); else return NULL;

с тебя $100 :)

SadStork
()

#define strlen_null(p) (p) ? strlen(p) : NULL

$50 мне :))

ananas ★★★★★
()

2 ananas.
Облом тебе, а не $50.

char c[] = "";
int i = strlen_null(c) + 2;

будет после подстановки выглядеть так:

char c[] = "";
int i = (c) ? strlen(c) : NULL + 2;

Во-первых, при компиляции gcc будет ругаться на арифметику с void* (NULL+2 == ((void*)0)+2).
Во-вторых, gcc будет ругаться на то, что strlen(c) имеет тип int, а NULL+2 -- тип void* (два последних операнда для `?:' должны быть одного типа).
Во-третьих, в результате i будет равно не 2 (как ожидалось), а 0.

Так что делать так:

#define mystrlen(p) ((p) ? strlen(p) : 0)

nobody ★★
()

согласен, ступил, бо ориентировался на первый ответ :(

$50 SadStork-а переходят nobody :)))

з.ы. жадный я сегодня :))

ananas ★★★★★
()

как только anonymous пришлет - сразу делюсь :)

SadStork
()

Варианты с макросами, собственно, все не покатят, ибо mystrlen(p++) даст совсем не тот результат, что ожидается. $200.

aa5779
()

Тады только inline. Но в случае Си он поддерживается не всеми компиляторами.

nobody ★★
()

Тогда, если позволяет религия, можно воспользоваться расширением gcc

#define mystrlen(p) strlen((p)?:"")

Хотя как себя поведёт с p++ незнаю надо порверять, но пологике всё должно быть ok

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.