strncmp C Упражнение - PullRequest
       15

strncmp C Упражнение

0 голосов
/ 12 октября 2009

Я пытаюсь выполнить упражнение 5-4 в книге K & R C. Я написал методы для strncpy и strncat, но у меня возникли некоторые затруднения с пониманием того, что именно нужно вернуть для части упражнения strncmp.

Определение strncmp (из Приложения B в книге K & R):

сравнить не более n символов строки s со строкой t; вернуть <0, если s <t, 0, если s == t, или> 0, если s> t

Допустим, у меня есть 3 строки:

char s[128] = "abc"
char t[128] = "abcdefghijk"
char u[128] = "hello"

И я хочу сравнить их, используя функцию strncmp, которую я должен написать. Я знаю, что

strncmp(s, t, 3)

вернет 0, потому что abc == abc. Где я запутался, так это другие сравнения. Например

strncmp(s, t, 5) and
strncmp(s, u, 4)

Первый соответствует 3-й позиции, а затем уже не совпадает, а второй пример не совпадает вообще.

Я просто хочу знать, что возвращают эти два других сравнения и почему, чтобы я мог написать свою версию strncmp и закончить упражнение.

Ответы [ 4 ]

2 голосов
/ 27 июня 2011

Контракт для strncmp должен вернуть целое значение, знак которого указывает результат сравнения:

  • отрицательное значение указывает, что 1-й операнд сравнивается как «меньше» 2-го операнда,
  • положительное ненулевое значение указывает, что 1-й операнд сравнивается как «больше чем», чем 2-й операнд, и
  • 0 указывает, что два операнда сравниваются как «равные» друг другу.

Причина, по которой он определен таким образом, вместо, скажем, «возврата -1 для« меньше чем », 0 для« равно »и +1 для« больше чем », заключается в том, чтобы не ограничивать реализацию.

Значение, возвращаемое для конкретной библиотеки времени выполнения C, зависит от того, как реализована функция. Спецификация Posix (IEEE 1003.1) для strncmp() (которая соответствует стандарту C) гласит:

Функция strncmp () должна сравнивать не более n байтов (байтов, следующих за нулем) байты не сравниваются) от массива, на который указывает s1, до массива, на который указывает s2.

Знак ненулевого возвращаемого значения определяется знаком разности между значениями первой пары байтов (оба интерпретируются как тип unsigned char), которые отличаются сравниваемыми строками.

Это должно быть все, что вам нужно знать для его реализации. Вы должны отметить, что:

  • strncmp() не является «безопасным» в том смысле, что он подвержен переполнению буфера. Правильная реализация будет весело сравнивать символы, пока не встретит ASCII NUL, не достигнет максимальной длины или не попытается получить доступ к защищенной памяти.
  • В спецификации сказано, что знак возвращаемого значения основан на дельте между первой парой символов, которые отличаются; конкретное возвращаемое значение не требуется.

Удачи.

2 голосов
/ 12 октября 2009

Символы в первых несоответствующих позициях приводятся к unsigned char и затем сравниваются численно - если этот символ в s1 меньше соответствующего символа в s2, то возвращается отрицательное число; если оно больше, возвращается положительное число.

2 голосов
/ 12 октября 2009

Оба возвращают отрицательное число (оно сравнивается только по порядку символов). Я только что сделал быстрый тест, и на моей машине он возвращает разницу последних сравниваемых символов. Итак:

strncmp(s, t, 5) = -100  // '\0' - 'd'
strncmp(s, u, 4) = -7    // 'a' - 'h'

Это то, что вы ищете?

1 голос
/ 12 октября 2009

это лексикографический порядок, строки сравниваются в алфавитном порядке слева направо.

So abc

strncmp (s, t, 5) = -1 strncmp (s, t, 5) = -1

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