исходный код c strcmp - PullRequest
       1

исходный код c strcmp

3 голосов
/ 21 декабря 2010
int strcmp(const char *s1, const char *s2)

{
  int ret = 0;

  while (!(ret = *(unsigned char *) s1 - *(unsigned char *) s2) && *s2) ++s1, ++s2;

  if (ret < 0)

    ret = -1;
  else if (ret > 0)

    ret = 1 ;

  return ret;
}

Я просматриваю код от: http://www.jbox.dk/sanos/source/lib/string.c.html

Я полагаю, что есть какая-то проблема.Если strlen(s2)>strlen(s1), то ++s1 может выходить за пределы допустимого диапазона.К сожалению, тогда функция возвращает ошибку.

Ответы [ 3 ]

7 голосов
/ 21 декабря 2010

Нет, такой проблемы нет, поскольку цикл продолжается только тогда, когда * s1 и * s2 равны , а * s2 не равно 0. Если s1 короче, когда он достигает \ 0 в конце из s1 условие равенства нарушается и цикл останавливается.

1 голос
/ 21 декабря 2010

s1 неявно охраняется из-за нулевого завершения.Нулевое завершение приведет к разнице между «* (unsigned char ) s1» и « (unsigned char *) s2», что приведет к завершению цикла.

Так что нет,код выглядит для меня правильным.

1 голос
/ 21 декабря 2010

Нет, такой проблемы нет при условии, что s2 завершен '\ 0'.

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