Domanda

Ho un file di dizionario non ordinato chiamato " dict.txt " ;. Sono riuscito a mettere le parole del file in un array e anche qsort () che uso sembra funzionare correttamente (ovvero, l'array è ordinato).

Il problema sorge quando chiamo bsearch (), il programma si arresta in modo anomalo e la mia domanda è:

Perché sta succedendo questo?

Uso gcc per compilare e non uso un IDE di alcun tipo, quindi non ho alcun debugger né so come usarne uno (ancora).

Sono abbastanza consapevole che il codice qui presentato potrebbe contenere diversi problemi.

Questo perché sono abbastanza nuovo in c e il mio background è principalmente Java (che nonostante le somiglianze sembra essere uno svantaggio, perché sono così abituato a OO e c ovviamente non è OO).

Qualsiasi consiglio sarebbe molto apprezzato.

int strcmp_mod(const void *p1, const void *p2) {
   return strcmp(* (char * const *) p1, * (char * const *) p2);
}

int main(void) {

int size, i;
char **words;

char *pItem;
char *key = "fight";

char* buf = load_file("dict.txt"); if (buf == NULL) return 1;

size = count_words(buf);

words = (char**)malloc((size+1) * sizeof(char*));

for (i=0; i<size; i++) {
    words[i] = (char*)malloc(80 * sizeof(char));
}   

copy_words_to_lower(buf, words, size);
    words[size] = '\0';

    qsort(words, size, sizeof(char*), strcmp_mod);

for (i=0; i<size; i++) {
    printf("%s\n", words[i]);
}  

pItem = (char *) bsearch(key, words, size, sizeof(char*), strcmp_mod);

if (pItem!=NULL)
    printf ("%s is in the array.\n", pItem);
else
    printf ("%s is not in the array.\n", key); 

return 0;
}
È stato utile?

Soluzione

Prova a fornire a bsearch l ' indirizzo della chiave .

Altri suggerimenti

Perché sta succedendo questo?

Stai passando un char * come parametro key a bsearch, ma il tuo comparatore si aspetta il risultato della trasmissione di un char ** annullare *.

Dopo aver risolto il problema, il problema successivo è che il valore restituito da bsearch è un puntatore all'elemento corrispondente nell'array. Quindi ancora un char ** non un char * .

Qualsiasi consiglio sarebbe molto apprezzato.

Prendi un debugger o preparati ad aggiungere molte registrazioni al tuo codice.

Anche la costruzione della tua matrice words è leggermente off. Così com'è fa il lavoro, ma potrebbe essere un'idea di allocare il buffer per ogni parola mentre procedi, piuttosto che tutte le stesse dimensioni all'inizio. Chissà se qualcuno ti invierà un file con una parola in più di 80 caratteri? Terminate l'elenco di parole con un carattere , '\ 0' nul, quando probabilmente intendete terminarlo con un puntatore , NULL. '\ 0' funziona davvero, perché è un altro modo di dire 0 e 0 converte in un puntatore nullo. Ma non è quello che vuoi dire. E l'array non ha bisogno di essere nullo in questo momento, perché ogni volta che lo usi dopo aver specificato la sua lunghezza, size .

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