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);
    }
.

È stato utile?

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 ) {
  // ..
}
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top