if (memcmp (версия, "\ x0 \ x0 \ x0", 3) == 0) - PullRequest
1 голос
/ 10 января 2011

Я работаю над фрагментом кода, у которого есть следующее утверждение:

if (memcmp (version, "\x0\x0\x0", 3) == 0 )       

Какие данные сравниваются с версией?Это то же самое, что сравнивать с «000»?

Ответы [ 6 ]

6 голосов
/ 10 января 2011

Нет, это не то же самое, что "000".Он сравнивает три нулевых (0) байта.Каждый байт является действительным значением нуля в двоичном виде.Это отличается от "000", который представляет собой строку, содержащую значения ASCII для печатаемого символа 0, что составляет 48 (или 30 в шестнадцатеричном формате).

Так что "000" будетбыть таким же как "\x30\x30\x30".

4 голосов
/ 10 января 2011

"\x0\x0\x0" равно { 0x00, 0x00, 0x00, 0x00 }. Четвертый ноль - нулевой терминатор строки.

Итак, чтобы ответить на ваш вопрос - нет, это не то же самое, что сравнивать с "000".

'\x0' - это шестнадцатеричный ноль, тогда как '0' - это код ASCII символа 0 (шестнадцатеричный 30).

1 голос
/ 10 января 2011

\x0 означает char со значением 0. 0 отличается, это символ ASCII с кодом 0x30.

1 голос
/ 10 января 2011

Нет - это не то же самое, что сравнение с "000". Это сравнивается с тремя нулевыми символами. Эквивалентная и, вероятно, более ожидаемая строка будет "\0\0\0". Или просто 3-символьный массив, заполненный 0, для этого случая, когда код все равно проверяет только 3 символа.

0 голосов
/ 10 января 2011

Было бы интересно узнать определение переменной version. Это void * или char * или какой-то другой странный кастинг. Это, вероятно, выдает предупреждение во время компиляции.

Также было бы разумно посмотреть, как инициализируется version, чтобы убедиться, что ошибок нет. Это, конечно, странный способ проверить (отсутствие) номера версии в программе.

0 голосов
/ 10 января 2011

Нет.\ x0 является литералом для NULL.«000» является числом и имеет другое представление в памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...