Это ошибка в мануале. Он описывает strcmp()
, который прекращает сравнение, когда достигает нулевого байта в одной из строк, поскольку это признак конца строки; более длинная строка будет считаться большей ("foobar"
больше, чем "foo"
). Но memcmp()
предназначен для сравнения произвольных областей памяти, а не строк, поэтому нулевые байты специально не обрабатываются.
Однако это не объясняет, почему memcmp()
возвращает -1
. Он должен сравнивать '\200'
и '\0'
и возвращать положительное значение. Кажется, что Дарвин memcmp()
сравнивает их как signed char
, а не как unsigned char
, поэтому '\200'
это -128
, а не 128
. Если первая строка имеет значение от "\200"
до "\377"
, она возвращает этот неверный результат.
Когда я пробую ваш код в Linux, я получаю 1
, а не -1
. Так что это похоже на ошибку в библиотеке Дарвина. А также ошибка на странице руководства, так как там написано, что они сравниваются как unsigned char
.
Я пробовал эту программу:
#include <stdio.h>
#include <string.h>
int main()
{
printf("memcmp: %i\n", memcmp("\200", "\0", 1));
printf("bcmp: %i\n", bcmp("\200", "\0", 1));
printf("strcmp: %i\n", strcmp("\200", "\0"));
return (0);
}
В Mac OS High Sierra он печатает:
memcmp: -1
bcmp: 128
strcmp: 128
в Debian Linux я получаю:
memcmp: 1
bcmp: 1
strcmp: 1
Упоминание строк нулевой длины на странице руководства также неверно. "\0abc"
и "\0def"
являются строками нулевой длины, поскольку строки логически заканчиваются нулевым байтом. Но они сравнивают разные с memcmp()
printf("memcmp: %i\n", memcmp("\0abc", "\0def", 4));
printf("bcmp: %i\n", bcmp("\0abc", "\0def", 4));
printf("strcmp: %i\n", strcmp("\0abc", "\0def"));
печатает:
memcmp: -1
bcmp: -3
strcmp: 0
person
Barmar
schedule
20.05.2018
strcmp()
, а неmemcmp()
. - person Barmar   schedule 20.05.2018memcmp()
может отсутствовать. - person alk   schedule 20.05.2018128
- person 1ShotSniper   schedule 20.05.2018<string.h>
, чтобы получить прототипmemcmp()
. - person Barmar   schedule 20.05.2018memcmp
реализации (blog.bramp.net/post/2009/08/10/), и хотя FreeBSD с тех пор исправила эту ошибку, Darwin так и не скопировал это исправление. Если кто-то может подтвердить, что это проблема, опубликуйте ее как ответ. - person   schedule 20.05.2018libc
. Однако я повторно протестировал только ‹string.h› с теми же результатами. - person 1ShotSniper   schedule 20.05.2018bcmp()
возвращает ожидаемое128
, поэтому это не похоже на ту же ошибку. - person 1ShotSniper   schedule 20.05.2018#include <string.h>
, за которым следует#undefine memcmp
, по стандарту должен удалить любой макрос, скрывающий имя функцииmemcmp
. - person Davislor   schedule 27.05.2018