То, что strcmp() точно возвращается в C?

Я написал этот код в C:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>

int main()
{
    char string1[20];
    char string2[20];
    strcpy(string1, "Heloooo");
    strcpy(string2, "Helloo");
    printf("%d", strcmp(string1, string2));
    return(0);
}

Должна ли консоль печатать значение 1 или разницу между значениями ASCII символов o и \0, т.е. 111? На этот сайт, написано, что это должно выдавать put 111, но когда я запускаю его на своем ноутбуке, он показывает 1. Почему?

Ответ 1

Из документации cppreference.com

int strcmp( const char *lhs, const char *rhs );

Возвращаемое значение

  • Отрицательное значение, если lhs появляется перед rhs в лексикографическом порядке.

  • Нуль, если lhs и rhs сравниваются равными.

  • Положительное значение, если lhs появляется после rhs в лексикографическом порядке.

Как вы можете видеть, это просто говорит отрицательный, нулевой или позитивный. Вы не можете рассчитывать ни на что другое.

Связанный с вами сайт не является неправильным. Он сообщает вам, что возвращаемое значение < 0, == 0 или > 0, и оно дает пример и показывает его вывод. Он не говорит, что вывод должен быть 111.

Ответ 2

Чтобы процитировать страницу руководства:

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

Другими словами, вы никогда не должны полагаться на точное возвращаемое значение strcmp (кроме 0, конечно). Единственная гарантия заключается в том, что возвращаемое значение будет отрицательным, если первая строка "меньше", положительная, если первая строка "больше" или 0, если они равны. Те же самые входы могут генерировать разные результаты на разных платформах с различными реализациями strcmp.

Ответ 3

strcmp возвращает значение меньше 0, если строка1 в алфавитном порядке меньше строки2; zero, если они равны; и "значение больше 0", если строка 2 больше.

Ответ 4

Результат зависит от реализации. Достойной реализацией функции strcmp будет:

int strcmp (const char * s1, const char * s2)
{
    for(; *s1 == *s2; ++s1, ++s2)
        if(*s1 == 0)
            return 0;
    return *(unsigned char *)s1 < *(unsigned char *)s2 ? -1 : 1;
}

Вышеупомянутая реализация возвращает -1, если s1 < s2, 1, если s1 > s2 и 0, если s1 = s2.
Но, как правило, существует более быстрая версия, которая реализована для фактического использования:

int strcmp (const char * s1, const char * s2)
{
    for(; *s1 == *s2; ++s1, ++s2)
        if(*s1 == 0)
            return 0;
    return *(const unsigned char *)s1 - *(const unsigned char *)s2;
}

Обратите внимание, что это быстрее, потому что оно пропускает ветвление, которое делалось ранее. Поэтому обычно мы имеем соглашение о том, что отрицательное возвращаемое значение означает, что s1 лексикографически меньше s2, а положительное значение означает наоборот.

Ответ 5

int strcmp(const char *str1, const char *str2)

возвращает значение меньше, равно или больше 0. Если оно возвращает 0, это означает, что две строки равны, если он возвращает значение, меньшее, чем 0, это указывает, что str1 меньше, чем str2. Если он возвращает значение > 0, это означает, что str2 меньше, чем str1.

Ваше возвращаемое значение равно 1, потому что "Heloooo" - это один символ больше, чем "Helloo". На самом деле слово Helloo имеет 6 символов, а Heloooo имеет 7 символов. Точно еще один char.

Ответ 6

В принципе, strcmp() может возвращать следующее:

  • > 0, если вторая строка меньше первой первой строки.

    char s1, s2; strcpy (s1, "helloworld"); strcpy (s2, "world"); int check = strcmp (s1, s2);

  • 0, если переданные строки совпадают.

    char s1, s2; strcpy (s1, "hello"); strcpy (s2, "hello"); int check = strcmp (s1, s2);

    В этом случае, когда строки равны, проверка будет иметь 0.

  • < 0, если первая строка меньше второй.

    char s1, s2; strcpy (s1, "hello"); strcpy (s2, "worldhello"); int check = strcmp (s1, s2);

Итак, в вашем случае strcmp () вернет 1, поскольку строки не равны.

Ознакомьтесь с этим и этим учебным пособием о strcmp ().