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

Является ли законным передавать строку с нулевым завершением в strncmp в C?

У меня есть массив из 16 байтов, который содержит имя исполняемого сегмента.

char segname[16];

Если длина имени сегмента меньше 16 байт, тогда остальное заполняется нулевыми байтами. В противном случае нулевой байт не завершается.

Я хочу сравнить segname с различными строками, например. __text.

Можно ли вызвать strncmp с помощью строки с нулевым завершением?

Этот пост предполагает, что он является законным. Этот исходный код делает его законным. Но моя страница человека говорит:

Функция strncmp() лексикографически сравнивает строки с нулевым завершением s1 и s2.

Размер, передаваемый в strncmp, будет иметь размер segname.

Мне интересно, о чем я должен говорить.

4b9b3361

Ответ 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