Mit stdlib ist qsort() sortiert ein array von strings
Einige Vorwort: ich bin ein computer-engineering-student ein Erster Klasse in C nach 3 Semestern Java (bis zu Datenstrukturen). Diese Frage ist in Bezug auf eine Hausaufgabe, sondern ein paar Schritte entfernt von der Lösung für mich.
Habe ich eine input-Datei, die ich in den Speicher gelesen, so dass es gespeichert char[9][500]. Ich lese in höchstens 500 strings der maximalen Länge 8. Ich bin versucht zu Sortieren dieses Arrays mittels stdlib built-in qsort () - Funktion, und bin mit einigen memory-Fehler.
Wichtige code-Schnipsel:
char data[4][500][60];
char debug[500][9];
size_t count = 0;
/* initialize file, open for reading */
FILE* pUserlog;
pUserlog = fopen("userlog","r");
while(!feof(pUserlog))
{
fscanf(pUserlog, "%9s %8s %16s",debug[count], data[1][count], data[2][count]);
fgets(data[3][count], 60, pUserlog);
count++;
}
Dieser Abschnitt liest die Daten in den arrays. Das array von Interesse sind in diesem Teil die "debug". Dies ist das array oben angegeben. Hier ist meine Vergleichsfunktion für qsort:
int compare(const void* a, const void* b)
{
const char **ia = (const char **)a;
const char **ib = (const char **)b;
puts("I'm in compare!");
return strncmp(*ia, *ib,8);
}
Dies ist mein Versuch, call qsort:
size_t debug_len = sizeof(debug)/sizeof(char*);
printf("debug len: %d, count: %d, sizeof(char*): %d\n",debug_len,count,sizeof(char*));
qsort(debug,count, sizeof(char *), compare);
Ich versuchte, ersetzen debug_len in meinem Anruf wo Graf ist, aber ich bin immer noch segfaulting. Hier ist die Ausgabe:
$ ./test debug-len: 1125, Anzahl: 453, sizeof(char*): 4 Ich bin im vergleichen! Segmentation fault (core dumped)
Danke!
- while( !feof() ) ist falsch. feof false zurück, wird die Schleife eingetragen wird, die scanf wird scheitern, Daten zu Lesen, zu Debuggen[ count ] enthält falsche Daten, und dann feof true zurück. Sie können dieses Problem beheben, case-by-doing-zählen-nach der Schleife, aber generell sollte man einfach nicht tun, während( !feof())
- Wo kommt der segfault? Es ist eine gute übung, um zu untersuchen core-dump zu bestimmen, wo der segfault passiert, als dass in der Regel sagt Ihnen, was das problem ist.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Vergleichsfunktion erhält Zeiger auf die Elemente, die verglichen werden. Sie sind effektiv vergleichen zu wollen Charaktere mit
strncmp()
. Da haben Sie einen Zeiger auf jede der Saiten, Stimmen Sie zu einemchar *
und vergleichen.Denke auch, es ist ein array von arrays, und nicht ein array von Zeigern. Also die Größe von einem element die Größe des Arrays
9
und nicht der Zeiger,4
. An dieser Stelle wäre es einfacher einfach zu verwendensizeof debug[0]
da es ein zwei-dimensionales array. Wenn Sie dies nicht tun, mit der richtigen Größeqsort()
nur zerstören Sie Ihre array.Was hier passiert ist: du hast 500 strings. Jetzt passieren Sie alle 500 bis qsort, und es wiederum übergibt jeweils als erstes und zweites argument Ihrer Funktion vergleichen. Es ist ein bisschen wie das schreiben dieses:
Den C-compiler übergibt die Adressen, nicht die tatsächlichen Werte natürlich. Aber jetzt ist Sie interpretieren die Zeiger auf void Zeiger auf Zeiger auf char. Dein code macht nun eine Dereferenzierung beim Aufruf
strncmp
, aber das macht die Wert (die ersten 4 bytes) werden behandelt wie ein Zeiger instrncmp
. Aberstrncmp
wird nun wiederum versuchen, Sie zu dereferenzieren den Müll "Zeiger" (die darin besteht, der Teil eines der Saiten) und das macht bang.Dieses Problem zu beheben, verwenden Sie
char *
stattchar **
: