Schiantarsi quando qsorting una serie di puntatori a stringhe
Domanda
Così ho cercato questo forum e quando tornai e leggi ogni piccolo dettaglio in questo capitolo sull'utilizzo di qsort()
, ma non riesco a capirlo.Quando corro il mio codice si schianta ogni volta, ho provato a lanciare usando ogni diverso metodo che potrei trovare eppure non riesco a farlo smettere di schiantarsi.
char *line[MAX_WORDS] <- This is my array I am trying to sort
qsort(line, word_count, sizeof(char*), compare_words);
int compare_words(const void *p, const void *q)
{
const char *p1 = *(char**)p;
const char *q1 = *(char**)q;
return strcmp(p1, q1);
}
.
Ecco il codice fonte completo
// Capitolo 17 Progetto di programmazione # 6 // Capitolo 17 Progetto di programmazione # 5
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_WORD_LEN 20
#define MAX_WORDS 10
int read_line(char str[], int n);
int compare_words(const void *p, const void *q);
int main(void)
{
char *line[MAX_WORDS], word_str[MAX_WORD_LEN];
int i = 0, word_count = 0;
for (;;) {
printf("Enter word: ");
read_line(word_str, MAX_WORD_LEN);
if (strlen(word_str) == 0)
break;
line[i] = malloc(strlen(word_str));
if (line[i] == NULL) {
printf("-- No space left --\n");
break;
}
strcpy(line[i], word_str);
word_count++;
}
printf("Word_count: %d\n", word_count);
qsort(line, word_count, sizeof(char*), compare_words);
printf("\nIn sorted order:");
for (i = 0; i <= word_count - 1; i++)
printf(" %s", line[i]);
putchar('\n');
return 0;
}
int read_line(char str[], int n)
{
int ch, i = 0;
while ((ch = getchar()) != '\n')
if (i < n)
str[i++] = ch;
str[i] = '\0';
return i;
}
int compare_words(const void *p, const void *q)
{
const char *p1 = *(char**)p;
const char *q1 = *(char**)q;
return strcmp(p1, q1);
}
. Soluzione
Stai superando alcuni buffer:
line[i] = malloc(strlen(word_str));
// ...
strcpy(line[i], word_str);
.
È necessario includere lo spazio per il carattere di terminazione '\0'
, tramite:
line[i] = malloc(strlen(word_str) + 1);
// ...
strcpy(line[i], word_str);
.
o
line[i] = strdup(word_str);
if (line[i] == NULL) {
printf("-- No space left --\n");
break;
}
.
e non stai mai incrementando i
durante la lettura delle parole, quindi avrai word_count
a 5
o qualcosa del genere, ma tutte le parole sono state temporaneamente puntate da line[0]
;Il resto (line[1]..line[4]
) non è intiigurato.
Cambia il tuo primo ciclo for
su:
for ( i = 0; i < MAX_WORDS; ++i ) {
// ..
}
.