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 может выходить за пределы допустимого диапазона.К сожалению, тогда функция возвращает ошибку.
strlen(s2)>strlen(s1)
++s1
Нет, такой проблемы нет, поскольку цикл продолжается только тогда, когда * s1 и * s2 равны , а * s2 не равно 0. Если s1 короче, когда он достигает \ 0 в конце из s1 условие равенства нарушается и цикл останавливается.
s1 неявно охраняется из-за нулевого завершения.Нулевое завершение приведет к разнице между «* (unsigned char ) s1» и « (unsigned char *) s2», что приведет к завершению цикла.
Так что нет,код выглядит для меня правильным.
Нет, такой проблемы нет при условии, что s2 завершен '\ 0'.