Что именно 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? На этом сайте написано, что это должно выдавать пут 111, но когда я запускаю его на своем ноутбуке, он показывает 1. Почему?

6 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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

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

Выход зависит от реализации. Достойная реализация 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, и 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, а положительное значение означает наоборот.

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

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

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

В принципе, 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 (),

Другие вопросы по тегам