Как посчитать сравнение в функции strcmp (), если входы имеют разную длину? - PullRequest
0 голосов
/ 11 февраля 2019

Я создаю программу сортировки с оценкой в ​​качестве условия и хочу узнать, как strcmp () сравнивает 2 строки разной длины. Например, если одна из них - «A», а другая - «AB», почемуозначает, что "A" меньше, чем "AB", но если первая строка "B", вторая строка (которая "AB") меньше, чем "B".Как мне узнать значение каждой строки и как я считаю?

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Это лексикографический вид.Если одна строка является префиксом другой, эта строка стоит первой в порядке.Но вы можете разбить его следующим образом.

Вы сравниваете символ за символом, в то время как символы одинаковы.Как только вы наберете два разных символа, любой из них будет соответствовать младшей строке.Если одна из строк слишком коротка, чтобы продолжать сравнение, это меньшая строка.

Вот базовая реализация strcmp.

int strcmp(const char *s1, const char *s2) {
  while(*s1 == *s2) {
    if(*s1 == '\0') return 0;
    s1++;
    s2++;
  }
  return *s1 - *s2;
}
0 голосов
/ 11 февраля 2019

strcmp останавливается на первой разнице.

Поскольку "A" на самом деле представляет собой два символа ('A' и 0), при сравнении с "AB" первая разница находится на втором символеи 0 меньше 'B' в вашей кодировке 1 , поэтому "A" получается меньшим.

При сравнении "B" с "AB" первое отличиена первом символе, с "AB", получающимся меньшим.

Это все довольно хорошо, поскольку строки упорядочены так, как они были бы в словаре.


1 С тянет быстро в этом.Хотя 'B' является целым числом и может быть отрицательным, а strcmp принимает const char *, 7.24.4 1 подкрадывается к этому: «Знак ненулевого значения, возвращаемого функциями сравнения memcmp, strcmp и strncmp, определяется знакомразницы между значениями первой пары символов (оба интерпретируются как символы без знака), которые различаются в сравниваемых объектах ». Так что это не просто кодировка OP - в любой кодировке разница (символ без знака) '\ 0'- (без знака) «B» отрицательно.За исключением теоретической реализации с sizeof (int) == 1. Признать Eric Postpischil .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...