Основная проблема в вашей функции заключается в том, что вы не передаете обновленные указатели в рекурсивном вызове на revisedStrcmp
, вызывая бесконечный цикл и потенциальный переполнение стека .
Вотисправленная и упрощенная версия:
int revisedStrcmp(const char *s1, const char *s2) {
if (*s1 < *s2)
return -1;
if (*s1 > *s2)
return +1;
// *s1 == *s2
if (*s1 == '\0')
return 0;
return revisedStrcmp(s1 + 1, s2 + 1);
}
Нет необходимости создавать особые случаи для более коротких строк, поскольку в сравнениях можно использовать нулевой терминатор.
Этот особый стиль рекурсии называется хвостом.рекурсия и будет скомпилирована в цикл современными компиляторами.
Обратите внимание, однако, что для revisedStrcmp()
для возврата того же порядка, что и strcmp
, сравнения должны выполняться на значениях unsigned char
вместо простых char
, который может быть подписан по умолчанию на многих архитектурах:
int revisedStrcmp(const char *s1, const char *s2) {
unsigned char c1 = *s1, c2 = *s2;
if (c1 < c2)
return -1;
if (c1 > c2)
return +1;
// c1 == c2
if (c1 == '\0')
return 0;
return revisedStrcmp(s1 + 1, s2 + 1);
}