Speicher für die neue Zeichenfolge zuweisen Wie andere gesagt haben, müssen Sie Kopien der Saiten erstellen, Andernfalls setzen Sie die Zeichenfolgen auf die gleiche Adresse und überschreiben sich daher gegenseitig.
Darüber hinaus denke ich mit fgets
über gets
ist ein viel sicherer Ansatz. Dies liegt daran, gets
ist sehr anfällig für buffer overflow, während mit fgets
, können Sie einfach auf Pufferüberlauf überprüfen.
Dies ist ein Code ich vor einer Weile geschrieben, das ähnlich ist, was Sie versuchen zu erreichen: mit Sortier
#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;
}
Es gibt keinen qsort in Ihrem Code-Snippet und Ihr Problem nichts zu tun hat. Können Sie den Titel Ihrer Frage korrigieren? –
Nicht das Problem, aber: ** nie ** benutzen '' ''! Es wurde vor 5 Jahren aus dem C-Standard entfernt und ist seit 1999 veraltet. Verwenden Sie stattdessen "fgets". – Olaf
Ja, das stimmt @Olaf, ich bin ziemlich sicher, dass die neueste Version von 'gcc' warnt, dass du es nicht benutzt. – RoadRunner