В чём разница между !str и strlen(str) и str!=NULL
В чём разница между:
!strstrlen(str)str!=NULL
str - это const char *str
За что отвечает каждая из проверок?
Ответы (2 шт):
!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. я рекомендую всегда стараться писать полностью условие, хотя некоторые программисты очень любят экономить каждый символ.
Первая проверка !str выдает true, если c-строка (массив из char) не пустая, в противном случае false;
Вторая проверка strlen(str) считает количество элементов в массиве без учета нуль-терминатора;
Третья проверка str!=NULL выдает true, если указатель на массив сhar куда-то направлен, в противном случае false;