Подтвердить что ты не робот

Является ли '\ 0' гарантией 0?

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

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

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

4b9b3361

Ответ 1

В стандарте говорится:

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

Ответ 2

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

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

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

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

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

Ответ 3

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

Ответ 4

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