Ich entwickle eine Funktion in C, die Text um einen bestimmten Schlüssel sortiert. Angenommen, Sie haben die folgende Datei:Segmentierungsfehler im C-Sortierprogramm
this line is first
but this line is second
finally there is this line
Wenn Sie das Programm ausführen und diese Datei als Eingabe geben, sollte es drucken:
but this line is second
finally there is this line
this line is first
weil aber alphabetisch ist, bevor sie schließlich vor dieser ist.
Wenn Sie jedoch ein Flag übergeben, um einen anderen Schlüssel zu sortieren, erhalten Sie eine andere Ausgabe. Zum Beispiel, wenn Sie FastSort -2 auf diese Datei aufrufen, sollten Sie:
this line is first
finally there is this line
but this line is second
weil Leitung kommt, bevor es vor diesem kommt. Ja, ich nehme an, -2 bedeutet das zweite Wort in jeder Zeile (wie die meisten Leute, außer Informatikern, die immer bei 0 anfangen wollen).
Darüber hinaus, wenn der angegebene Schlüssel nicht in einer bestimmten Zeile der Eingabedatei vorhanden ist, sollte ich nur das letzte Wort dieser Zeile als Schlüssel verwenden. Wenn der Benutzer beispielsweise nach dem vierten Wort (-4) sortieren möchte und die Sortierung auf eine Zeile wie diese trifft (Beispielzeile), sollte die Sortierung das Wort Zeile verwenden, um diese Zeile zu sortieren.
Mein Problem kommt von dieser letzten Annahme, ich verwende strtok(), um das durch den Schlüssel gegebene Wort zu extrahieren, aber ich bekomme einen Segmentierungsfehler, wenn der Schlüssel größer als die Anzahl der Wörter in der Zeile ist. Hier ist der Körper der Funktion;
typedef struct {
char word[128];
int index;
} wordIndex;
char** fastsort(char** text, int word){
char** sortedText;
char* LineAux;
int i;
wordIndex tokenLines[numLines];
for(i=0; i<numLines; i++){
char* token;
int j = 0; //counter
LineAux = (char*) malloc(MAX_LENGTH*sizeof(char)); //MAX_LENGTH = 128
if (LineAux==NULL){
fprintf(stderr,"Error, malloc failed");
exit(1);
}
strcpy(LineAux,text[i]);
token = strtok(LineAux, " \n");
j++;
if(token == NULL){ //if blank line
token=" ";
} else {
while(token != NULL){ //segmentation fault
if(j == word){
break;
}
token = strtok(NULL, " \n");
j++;
}
}
strcpy(tokenLines[i].word,token);
tokenLines[i].index=i;
free(LineAux); //free Aux string
printf("token: %s Line: %d \n",tokenLines[i].word, tokenLines[i].index);
}
qsort(tokenLines,numLines,sizeof(wordIndex),compareTo); //sorting tokens
sortedText = (char**) malloc(numLines*sizeof(char*));
if (sortedText==NULL){
fprintf(stderr,"Error, malloc failed");
exit(1);
}
//reordering text
int n;
for (n=0; n<numLines; n++){
int index;
sortedText[n]=(char*) malloc(MAX_LENGHT*sizeof(char));
if (sortedText[n]==NULL){
fprintf(stderr,"Error, malloc failed");
exit(1);
}
index = tokenLines[n].index;
strcpy(sortedText[n],text[index]);
}
return sortedText;
}
die Segmentierungsfehler erscheint innerhalb der while-Schleife. Hoffe, dass Sie helfen können, Vielen Dank im Voraus.
Kann 'text [i]' jemals länger als 127 Zeichen plus das abschließende Byte sein? Denn wenn es möglich ist, wird Ihr 'strcpy' die Grenzen von LineAux' überschreiten. Dasselbe gilt für 'text [index]' weiter unten. –
@CharlesSrstka Nein, habe ich eine andere Funktion (die den Text aus der Datei extrahiert), die die Linie aus, die mehr als 127 Zeichen (+ endet), so dass es länger als das wird nie Was ist – Setekorrales
verhindert 'wordIndex'? Eine Art Struktur nehme ich es? –