Полагаю, вы уже знаете функцию стандартной библиотеки C qsort()
:
void qsort(void *base,
size_t nel,
size_t width,
int (*compar)(const void *, const void *);
Этот последний параметр является указателем на функцию , что означает, что вы можете передать ему любую функцию. На самом деле вы могли бы использовать strcmp()
, но это дало бы вам ASCIIbetical, а вам определенно нужен естественный вид.
В этом случае вы могли бы написать довольно легко:
#include <ctype.h>
int natural(const char *a, const char *b)
{
if(isalpha(*a) && isalpha(*b))
{
// compare two letters
}
else
{
if(isalpha(*a))
{
// compare a letter to a digit (or other non-letter)
}
else if(isalpha(*b))
{
// compare a digit/non-letter to a letter
}
else
{
// compare two digits/non-letters
}
}
}
Некоторые из else
могут быть очищены, если вы просто return
рано, но есть базовая структура. Проверьте ctype.h
для таких функций, как isalpha()
(если символ является частью алфавита), isdigit()
, isspace()
и т. Д.