В чём разница между !str и strlen(str) и str!=NULL

В чём разница между:

  • !str
  • strlen(str)
  • str!=NULL

str - это const char *str
За что отвечает каждая из проверок?


Ответы (2 шт):

Автор решения: KoVadim

!str эквивалентно str==NULL, это известный сишный подход. Я рекомендую всегда писать полностью, что бы избежать неоднозначностей. Как это работает? указатель в условиях интерпретируется как и число - nullptr(NULL) - это ноль и это false, все остальное - true.

А вот это - str!=NULL противоположное. То есть, проверяем, что указатель не нулевой.

А вот strlen(str) - немного другое. Эта функция возвращает длину строки, поискав в ней нулевой символ. В условиях это проверка, что строка не пустая. То есть, если строка будет содержать "", то strlen вернет 0, а 0 - это false. В остальных случаях это будет истинна.

Важно помнить, что если strlen получает nullptr указатель, то будут проблемы. Функция внутри не обязана проверять указатель и сразу приступает к поиску нулевого символа. Обычно, отладочные версии библиотек это делают, но вот релизные - нет. Поэтому, часто проверка на непустую строку может выглядеть так

if (s != NULL && strlen(s) != 0) { ... }

P.S. я рекомендую всегда стараться писать полностью условие, хотя некоторые программисты очень любят экономить каждый символ.

→ Ссылка
Автор решения: DefAir

Первая проверка !str выдает true, если c-строка (массив из char) не пустая, в противном случае false;

Вторая проверка strlen(str) считает количество элементов в массиве без учета нуль-терминатора;

Третья проверка str!=NULL выдает true, если указатель на массив сhar куда-то направлен, в противном случае false;

→ Ссылка