Как уже говорили другие, вам нужно создать копии строк, в противном случае вы устанавливаете строки на один и тот же адрес, и поэтому они просто перезаписывают друг друга.
Кроме того, я думаю, что использование fgets
над gets
является гораздо более безопасным подходом. Это связано с тем, что gets
очень подвержен buffer overflow, тогда как с fgets
вы можете легко проверить переполнение буфера.
Это некоторый код, который я написал некоторое время назад, который похож на то, что вы пытаетесь достичь:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define PTRS 3
#define STRLEN 30
int
string_cmp(const void *a, const void *b) {
const char *str1 = *(const char**)a;
const char *str2 = *(const char**)b;
return strcmp(str1, str2);
}
int
main(void) {
char *strings[PTRS];
char string[STRLEN];
int str;
size_t len, i = 0;
while (i < PTRS) {
printf("Enter a string: ");
if (fgets(string, STRLEN, stdin) == NULL) {
fprintf(stderr, "%s\n", "Error reading string");
exit(EXIT_FAILURE);
}
len = strlen(string);
if (string[len-1] == '\n') {
string[len-1] = '\0';
} else {
break;
}
strings[i] = malloc(strlen(string)+1);
if (strings[i] == NULL) {
fprintf(stderr, "%s\n", "Cannot malloc string");
exit(EXIT_FAILURE);
}
strcpy(strings[i], string);
i++;
}
qsort(strings, i, sizeof(*strings), string_cmp);
printf("\nSuccessfully read strings(in sorted order):\n");
for (str = 0; str < i; str++) {
printf("strings[%d] = %s\n", str, strings[str]);
free(strings[str]);
strings[str] = NULL;
}
return 0;
}
Там нет QSort в вашем фрагменте кода и ваша проблема не имеет ничего общего с сортировкой. Можете ли вы определить название своего вопроса? –
Не проблема, но: ** никогда не ** использовать 'get'! Он был удален из стандарта C 5 лет назад и был устаревшим с 1999 года. Вместо этого используйте 'fgets'. – Olaf
Да, это правда @Olaf, я уверен, что самая новая версия 'gcc' предупреждает вас не использовать ее. – RoadRunner