Проблема с вашей функцией swap
состоит в том, что она ожидает, что обе строки имеют
одинаковой длины или что оба места памяти достаточно велики, чтобы держать
строки. Рассмотрим этот пример:
char str1[] = "Hello";
char str2[] = "This is a so much longer string";
swap(str1, str2);
произойдет сбой, потому что str1
недостаточно велик для хранения содержимого str2
, поэтому
strcpy
вызовы будут записывать за пределы памяти, таким образом, вы переполнены
буфер. Это проблема, с которой вы сталкиваетесь.
Вы должны решить:
- выделить, например, 1024 байта для каждого
name[i]
, независимо от длины
имени. Можно предположить, что ни одно имя не длиннее 1024 символов. (Не делай этого, уродливое решение).
- Вместо того, чтобы менять содержимое, меняйте местами указатели. Это гораздо проще сделать
потому что
names
- это char**
, а name[i]
- это char*
с, так что поменяйте местами указатели
легко, так как вам не нужно беспокоиться о длине памяти, которую они
указывая на.
Функция подкачки может выглядеть следующим образом
void swap_ptrs(char **x, char **y)
{
char *tmp = *x;
*x = *y;
*y = tmp;
}
и вместо звонка
swap(names[i + 1], names[i]);
звоните:
swap_ptrs(names + i + 1, names + i);
, который поменяет указатели.
редактировать
Я понимаю, что вам даже не нужна функция swap_ptrs
для этого, вы можете сделать это так:
if (strcmp(names[i], names[i + 1]) > 0)
{
char *tmp = names[i];
names[i] = names[i + 1];
names[i + 1] = tmp;
}
И, как указывает jspcal , самым элегантным и надежным решением было бы использование qsort
:
int comp(const void *x, const void *y)
{
const char *a = *((const char **) x);
const char *b = *((const char **) y);
return strcmp(a, b);
}
int main(void)
{
...
qsort(names, number, sizeof *names, comp);
...
}