strcmp() возвращает значения в C

Я изучаю strcmp() в C. Я понимаю, что когда две строки равны, strcmp возвращает 0.

Однако, когда на справочных страницах указано, что strcmp возвращает меньше 0, когда первая строка меньше второй, относится ли это к длине, значениям ASCII или чему-то еще?


person dmubu    schedule 05.10.2011    source источник


Ответы (5)


В этом смысле «меньше чем» для строк означает лексикографический (алфавитный) порядок.

Таким образом, cat меньше, чем dog, потому что cat в алфавитном порядке предшествует dog.

Лексикографический порядок в некотором смысле является расширением алфавитного порядка для всех символов ASCII (и UNICODE).

person Mysticial    schedule 05.10.2011
comment
Из этого ответа можно подумать, что strcmp() знает о unicode. Это не относится к делу. - person Prof. Falken; 05.10.2011
comment
@Amigable Кларк Кант: Что касается юникода, я неявно имел в виду широкосимвольную версию strcmp(). Но да, я понимаю вашу точку зрения. - person Mysticial; 05.10.2011

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

person JRL    schedule 05.10.2011

C99 7.21.4:

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

Обратите внимание, в частности, что результат не зависит от текущей локали; LC_COLLATE (см. C99 7.11) влияет на strcoll() и strxfrm(), но не на strcmp().

person Keith Thompson    schedule 05.10.2011

Обратите внимание на следующую программу, здесь я возвращаю значение в зависимости от введенной вами строки. Функция strcmp возвращает значение в соответствии со значением ASCII всей строки, учитываемым полностью.

Например. str1 = "aab" и str2 = "aaa" вернут 1 как aab > aaa.

int main()
{
    char str1[15], str2[15];
    int n;
    printf("Enter the str1 string: ");

    gets(str1);
    printf("Enter the str2 string : ");
    gets(str2);
    n = strcmp(str1, str2);
    printf("Value returned = %d\n", n);
    return 0;
}
person Dalbir Singh    schedule 21.09.2013
comment
Добро пожаловать в stackoverflow и спасибо за ваш ответ. Обратите внимание, что на этот вопрос был дан ответ более двух лет назад, и на него есть достойный принятый ответ. Кроме того, ваш ответ на самом деле не отвечает на исходный вопрос. - person Itay; 21.09.2013

person    schedule
comment
Ваш ответ был бы значительно лучше, если бы вы могли объяснить, почему это отвечает на вопрос. - person Ben; 22.11.2012
comment
это также неправильный ответ, 1/-1 не соответствует стандарту C. И вы не проверяете перед разыменованием. - person Tomas Pruzina; 08.10.2014
comment
В Ubuntu 14.04 gcc не возвращает -1 или 1. Он возвращает (*s1 - *s2) - person Scooter; 27.03.2017