Является ли законным передавать строку с нулевым завершением в strncmp в C?
У меня есть массив из 16 байтов, который содержит имя исполняемого сегмента.
char segname[16];
Если длина имени сегмента меньше 16 байт, тогда остальное заполняется нулевыми байтами. В противном случае нулевой байт не завершается.
Я хочу сравнить segname
с различными строками, например. __text
.
Можно ли вызвать strncmp
с помощью строки с нулевым завершением?
Этот пост предполагает, что он является законным. Этот исходный код делает его законным. Но моя страница человека говорит:
Функция strncmp()
лексикографически сравнивает строки с нулевым завершением s1
и s2
.
Размер, передаваемый в strncmp
, будет иметь размер segname
.
Мне интересно, о чем я должен говорить.
Ответы
Ответ 1
В соответствии со стандартом C99, раздел 7.21.4.4, §3, это законно:
Функция strncmp
возвращает целое число, большее, равное или меньшее нуля, соответственно, поскольку массив , возможно, с нулевым завершением, на который указывает s1
, больше, чем, или меньше, чем массив с нулевым завершением, на который указывает s2
.
Обратите внимание, однако, что он говорит массив символов. По определению, если массив символов не имеет нулевого конца, это строка не.
Ответ 2
Функция strncmp сравнивает не более n символов (символов которые следуют за нулевым символом, не сравниваются) из массива, указанного на s1 в массив, на который указывает s2.
В спецификации 7.24.4.2 сказано, что. Стандарт C11.
Символы, которые не соответствуют нулевым символам, не сравниваются, поэтому он ожидает нулевой символ или строку символов. 1
Здесь вы также можете использовать символы с ненулевым завершающим символом, но в этом случае мы должны указать длину, до которой мы должны проверить ее, которая полезна в некоторых случаях.
<я > Исправления
[1] То, что символы, которые не соответствуют нулевому символу, не сравниваются, не означает, что strncmp
ожидает строки с нулевым завершением. Это просто означает, что strncmp
нуждается в специальном случае, чтобы сказать (например), что abc\0def
... и abc\0xyz
... сравнивают одинаковые. Нет ничего плохого в сравнении двух массивов char, которые не заканчиваются на нуль (до указанной длины) или сравнивают один массив с нулевым завершением char с другим, который не завершен нулемк югу >
Это добавляется непосредственно из комментария David Hammen