strncmp со слишком большим n дает странный вывод

У меня есть две строки для сравнения, и я подумал, что использование strncmp будет лучше, чем использование strcmp, потому что я знаю длину одной из строк.

char * a = "hel";
char * b = "he"; // in my real code this is scanned so it user dependent
for(size_t i = 0; i < 5; i++){
    printf("strncmp: %d\n", strncmp(a,b,i));
}

Я ожидал, что результат будет

0
0
0
1   // which is the output of printf("strcmp: %d\n", strncmp(a,b));
1

так как только на 4-й итерации (i = 3) строки начинают различаться, а вместо этого я получил

0
0
0
108  // guessing this is due to 'l' == 108 in ascii
108

и я не понимаю, почему, как говорит man:

Функция strcmp() сравнивает две строки s1 и s2. Он возвращает целое число, меньшее, равное или большее нуля, если найдено, что s1 соответственно меньше, соответствует или больше s2.

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

что означает, что он должен остановиться после достижения '\0' и, таким образом, просто вернуть 1 (например, strcmp), не так ли?


person CIsForCookies    schedule 03.05.2018    source источник
comment
Когда я запускаю что-то подобное на своей встроенной системе, происходит сбой Код, который вы показали, не должен давать сбой. Вы, вероятно, сделали что-то другое там.   -  person user694733    schedule 03.05.2018
comment
Когда i › 3, вы все равно получаете доступ к b за пределами границ.   -  person Jabberwocky    schedule 03.05.2018
comment
@MichaelWalz Я так не думаю, так как терминатор NUL все еще там.   -  person Angew is no longer proud of SO    schedule 03.05.2018
comment
@Angew, ты прав, он останавливается, как только встречается NUL.   -  person Jabberwocky    schedule 03.05.2018
comment
@user694733 user694733 Я удалил эту часть вопроса (и обнаружил, что там пошло не так).   -  person CIsForCookies    schedule 03.05.2018


Ответы (1)


Из приведенной вами цитаты:

... Он возвращает целое число, меньшее, равное или большее нуля...

И 1, и 108 являются целыми числами больше 0. Нет гарантии, что функция должна возвращать 1 или -1.

person Angew is no longer proud of SO    schedule 03.05.2018
comment
Однако чем отличается реализация strcmp от strncmp в возвращаемом значении? это очень странно - person CIsForCookies; 03.05.2018
comment
@CIsForCookies Что в этом странного? Функции делают разные вещи, и поскольку эти низкоуровневые подпрограммы, скорее всего, супероптимизированы, их можно реализовать совершенно по-разному. - person Angew is no longer proud of SO; 03.05.2018
comment
Ах, ну, я наивно думал, что они просто добавят условие в цикл for или что-то в этом роде, но я думаю, вы правы. Спасибо! - person CIsForCookies; 03.05.2018
comment
Angew, почему третье сравнение 0 (равно)? Вторая строка имеет длину 2, а первая - 3, поэтому сравнение 3 символов должно сказать, что строка 1 больше? - person Paul Ogilvie; 03.05.2018
comment
@PaulOgilvie Обратите внимание, что цикл начинается с 0, поэтому третье сравнение сравнивает 2 символа. - person Angew is no longer proud of SO; 03.05.2018
comment
Ах... да... первый сравнивает 0 символов, что равно :-) - person Paul Ogilvie; 03.05.2018