'\ 0' гарантированно равно 0? - PullRequest
       12

'\ 0' гарантированно равно 0?

20 голосов
/ 26 сентября 2011

Я написал эту функцию на C, которая предназначена для перебора строки до следующего символа, не являющегося пробелом:

char * iterate_through_whitespace(unsigned char * i){
    while(*i && *(i++) <= 32);
    return i-1;
}

Кажется, это работает довольно хорошо, но мне интересно, можно ли предположить, что *i будет оценено как ложное в ситуации, *i == '\0', и не будет повторяться после конца строка. Он хорошо работает на моем компьютере, но мне интересно, будет ли он вести себя так же при компиляции на других машинах.

Ответы [ 4 ]

14 голосов
/ 26 сентября 2011

Стандарт гласит:

В базовом наборе символов выполнения должен существовать байт со всеми битами, установленными в 0, который называется нулевым символом;используется для завершения строки символов.

13 голосов
/ 26 сентября 2011

Да, но, на мой взгляд, лучше быть более понятным:

while (*i != '\0' && ...

Но сравнение с 32 вряд ли является лучшим подходом. 32 бывает кодом ASCII / Unicode для символа пробела, но C не гарантирует какой-либо конкретный набор символов - и есть множество управляющих символов со значениями меньше 32, которые не являются пробелами.

Используйте функцию isspace().

(И я бы никогда не назвал указатель i.)

3 голосов
/ 26 сентября 2011

В C '\0' имеет точно такое же значение и тип , что и 0.Нет никаких причин писать '\0', кроме как из-за того, что унизили ваш код.\0 может быть полезен в двойных кавычках для создания строк со встроенными нулевыми байтами.

0 голосов
/ 26 сентября 2011

Стандарт ASCII предписывает, чтобы символ NUL кодировался как байт 0.Если вы не перестанете работать с кодировками, обратно совместимыми с ASCII, ничто не должно пойти не так.

...