it-swarm.com.ru

Лучший способ проверить, пуст ли массив символов

Какой самый надежный способ проверить, является ли массив символов пустым?

char text[50];

if(strlen(text) == 0) {}

или же

if(text[0] == '\0') {}

или мне нужно сделать

 memset(text, 0, sizeof(text));
 if(strlen(text) == 0) {}

Какой самый эффективный способ сделать это?

59
ZPS

Учитывая этот код:

char text[50];
if(strlen(text) == 0) {}

Далее следует вопрос об этом коде:

 memset(text, 0, sizeof(text));
 if(strlen(text) == 0) {}

Я чувствую замешательство. В частности, в этом случае:

char text[50];
if(strlen(text) == 0) {}

... содержимое text[] будет неинициализировано и не определено. Таким образом, strlen(text) вернет неопределенный результат.

Самый простой/быстрый способ обеспечить инициализацию строки C пустой строкой - просто установить первый байт в 0.

char text[50];
text[0] = 0;

С этого момента оба теста strlen(text) и очень быстрые, но не очень простые (text[0] == 0) обнаружат пустую строку.

71
bbum

Зависит от того, содержит ли ваш массив строку с нулевым символом в конце. Если так, то

if(text[0] == '\0') {}

должно быть достаточно.

Правка: другой метод будет ...

if (strcmp(text, "") == 0)

который потенциально менее эффективен, но ясно выражает ваше намерение.

19
Parappa

Это будет работать, чтобы найти, если массив символов пуст. Это, вероятно, также самый быстрый.

if(text[0] == '\0') {}

Это также будет быстро, если массив text пуст. Если он содержит символы, он должен сначала подсчитать все символы в нем.

if(strlen(text) == 0) {}
7
Peter Stuifzand

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

Третий метод не проверяет, является ли массив символов пустым; это гарантирует, что массив символов пуст.

4
James McNellis

Второй самый быстрый. Использование strlen будет закрыто если строка действительно пуста, но strlen всегда будет перебирать каждый символ строки, поэтому, если это нет пусто, это сделает гораздо больше работы, чем вам нужно.

Как упоминал Джеймс, третий вариант стирает строку перед проверкой, поэтому проверка всегда будет успешной, но она будет бессмысленной.

4
Graeme Perrow
if (text[0] == '\0')
{
    /* Code... */
}

Используйте это, если вы программируете для микроконтроллеров с небольшим пространством на флэш-памяти и/или оперативной памяти. Вы потратите много больше флэш-памяти, используя strlen, чем проверяете первый байт.

Приведенный выше пример является самым быстрым и требует меньше вычислений.

2
Tony