2012-03-07 4 views
3

В текущем базе кода я смотрю там, по крайней мере, эти:Идиоматический способ проверки пустой строки в C?

  • if(strlen(str) == 0)
  • if(str[0] != 0)
  • if(!*str)

И подобные варианты за это время пустой/не пуст , Первый читает лучше, но может тратить время (что может и не иметь значения). И я полагаю, что можно сделать макрос #define STR_EMPTY(str) (*(str) == 0).

Но так или иначе, существует ли общепринятый способ проверить, нет ли строки в C?

+0

Если значение str неизвестно заранее (в терминах, если оно равно нулю или нет), два и три действительно должны быть объединены. (Вы, наверное, знаете это, просто подумал, что я должен его выбросить.) – Corbin

+4

Я совершенно презираю такие макросы.Зачем кому-то искать макрос, чтобы увидеть, что он делает, когда код, который он обертывает, совершенно ясен сам по себе? –

ответ

4

Нет. Я видел все три. Лично я использую

if (!str[0]) 

Использование STRLEN трата процессорного времени и не безопасно, если вы не можете гарантировать, строка завершается.

+3

Ну, если он не завершен, ваш метод тоже не работает. Фактически, если строка не заканчивается, она никогда не может быть пустой, поскольку по определению пустая строка состоит только из завершающего символа. –

+0

Вопрос заключается в определении, является ли строка пустой, а не завершена ли она. –

+4

Если он не завершен, это не строка. – nos

0

Все ваши примеры в порядке. Это должно быть ясно из того факта, что все три находятся в вашей кодовой базе, что нет «общепринятого» метода.

+0

Возможно, вы правы. Но, похоже, что заключение не нуждается в стиле кодирования, глядя на кодовую базу, представляющую собой смесь CamelCase и lowercase_with_undercores. – user1255770

+0

Наверное, нет. Нет никакого консенсуса относительно верблюжьего случая и подчеркивания. Просто выберите один. –

+0

Тем не менее, если вы видите миллионы разных способов сделать то же самое, что бы задавали вопрос – perreal

0

Я бы определенно пошел с strlen(str) == 0, просто для наглядности.

функция должна быть реализована что-то вроде этого:

int strlen(char *s) { 
    int len = 0; 
    while(*(s++)) len++; 
    return len; 
} 

, так что не будет большой головой.

Редактировать: Предполагая, что вы уверены, что строка на самом деле завершена нулем.

+2

Нет больших накладных расходов? Что делать, если длина строки составляет килобайт или даже мегабайт? Вы в конечном итоге делаете 1000 или миллион приращений, указатели на удаление и сравнения по сравнению с одним сравнением. –

+0

Этого я бы избегал. Представьте, что вы вызываете это с помощью строки 2GB случайно. В плотной петле. –

+0

Да, я на самом деле не думал об этом, я просто предположил, что строка была нулевой большую часть времени. Если вы смотрите на большое количество данных, (str [0] == 0) определенно быстрее и безопаснее. – xato

3
  1. if(strlen(str) == 0) -> он будет аварии если str==NULL (вы должны проверить, прежде чем использовать strlen)
  2. if(str[0] != 0) -> то же самое, что и выше
  3. if(!*str) -> это на самом деле делает то же самое в 2)

Подводя итог: если вы хотите, чтобы сделать это безопасно:

if(!str || !(*str)) { /* empty string or NULL */ } 
+0

Вы имели в виду: 'if (! Str ||! * Str) {...}'? – wildplasser

+1

Я имел в виду именно то, что я написал: то, что вы написали, делает то же самое, что я писал (паранезия не имеет никакого значения). – sirgeorge

+0

Пустая строка не совпадает с нулевым указателем. Фактически, я бы изменил ваш '||' на '&&', чтобы убедиться, что вы выполняете только тело 'if', если у вас действительно есть строка для начала. – Marlon

1

Если вы уже знаете, что str является ненулевым:

if (!*str) { 
    // empty string 
} 

В противном случае:

if (!str || !*str) { 
    // empty string 
} 

Забудьте о strlen().

Смежные вопросы