LINUX.ORG.RU

strlen(NULL);


0

0

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

anonymous

Re: strlen(NULL);

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

с тебя $100 :)

SadStork ()

Re: strlen(NULL);

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

$50 мне :))

ananas ★★★★★ ()

Re: strlen(NULL);

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 ★★ ()

Re: strlen(NULL);

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

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

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

ananas ★★★★★ ()

Re: strlen(NULL);

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

SadStork ()

Re: strlen(NULL);

Ещё вариант:
#define mystrlen(p) strlen((p)?(p):"")

Дарю :) Щедрый я сегодна :)

anonymous ()
Ответ на: Re: strlen(NULL); от anonymous

Re: Re: strlen(NULL);


Да-а, парни, спасибо :-)

anonymous ()

Re: strlen(NULL);

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

aa5779 ()

Re: strlen(NULL);

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

nobody ★★ ()

Re: strlen(NULL);

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

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

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

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