Ответ 1
В стандарте говорится:
Байт со всеми битами, установленными в 0, называемый нулевым символом, должен существовать в наборе основных исполнений; он используется для символьная строка.
Я написал эту функцию в C, которая предназначена для итерации по строке на следующий символ небелого пробела:
char * iterate_through_whitespace(unsigned char * i){
while(*i && *(i++) <= 32);
return i-1;
}
Кажется, что все работает неплохо, но мне интересно, можно ли предположить, что *i
будет оцениваться как ложное в ситуации, когда *i == '\0'
, и не будет итерации после конца строка. Он хорошо работает на моем компьютере, но мне интересно, будет ли оно вести себя одинаково при компиляции на других машинах.
В стандарте говорится:
Байт со всеми битами, установленными в 0, называемый нулевым символом, должен существовать в наборе основных исполнений; он используется для символьная строка.
Да - но, на мой взгляд, лучше стиль более явный:
while (*i != '\0' && ...
Но сравнение с 32
вряд ли является лучшим подходом. 32
является кодом ASCII/Unicode для символа пробела, но C не гарантирует какой-либо определенный набор символов - и существует множество управляющих символов со значениями меньше 32, которые не являются пробелами.
Используйте функцию isspace()
.
(И я бы никогда не назвал указатель i
.)
В C, '\0'
имеет то же самое значение и тип как 0
. Нет причин когда-либо писать '\0'
, кроме как для того, чтобы убрать ваш код. \0
может, однако, быть полезным внутри двойных кавычек, чтобы создавать строки со встроенными нулевыми байтами.
В стандарте ASCII указывается, что символ NUL кодируется как байт 0
. Если вы не прекратите работать с кодировками, которые обратно совместимы с ASCII, ничего не должно идти не так.