Ihr Problem ist, dass Sie nur am EOF aufrufen, so dass es magisch nichts zu sehen bekommt, bevor Sie die ganze Datei gelesen haben. Vermutlich müssen Sie es aufrufen, wenn Sie das Ende eines Satzes erkennen (mit dem Test für , '?'
oder '!'
) - Sie müssen auch vor dem Aufruf von addSentence die Zeichenfolge null beenden und den Speicher mit einer neuen Zuordnung und dem richtigen zurücksetzen Größe) sowie bei EOF. Es ist nicht klar, warum Sie zwei Schleifen haben; Sie könnten einige Zeilenumbrüche als Satzende verpassen. Nacharbeiten mit nur einer Schleife.
Es ist nicht ganz klar, wenn Zeilenumbrüche die Enden von Sätzen markieren. Diese Revision nimmt an, dass sie tun:
int maxSize = 256;
int currSize = maxSize;
int i = 0;
int c;
char *sentence = (char*)malloc(maxSize);
assert(sentence != 0); // Not a production-ready error check
while ((c = fgetc(input)) != EOF)
{
sentence[i++] = c;
if ((c == '\n') || (c == '.') || (c == '?') || (c == '!'))
{
if (c != '\n')
sentence[i++] = '\n';
sentence[i] = '\0';
addSentence(sentence);
sentence = malloc(maxSize);
assert(sentence != 0); // Not a production-ready error check
currSize = maxSize;
i = 0;
}
if (i == currSize)
{
currSize = i + maxSize;
sentence = (char*)realloc(sentence, currSize);
assert(sentence != 0); // Not a production-ready error check
}
}
sentence[i] = '\0';
addSentence(sentence);
Beachten Sie, dass die Fehlerüberprüfung für fehlgeschlagene Speicherzuordnung nicht Produktionsqualität ist; Es sollte eine korrekte, bedingungslose Fehlerprüfung geben. Es besteht ein geringes Risiko eines Pufferüberlaufs, wenn das Ende der Satzzeichensetzung genau an der falschen Stelle liegt. Der Produktionscode sollte das ebenfalls vermeiden, aber es wäre findliger. Ich würde einen String-Datentyp und eine Funktion zum Hinzufügen verwenden. Ich nehme wahrscheinlich auch an, dass die meisten Sätze kürzer als 256 Zeichen sind (besonders wenn Zeilenumbrüche das Ende markieren) und würde maxSize
von 64
verwenden. Dies würde dazu führen, dass weniger ungenutzter Speicher zugewiesen wird.
Also im Grunde sagen Sie, dass das Problem in 'addSentence' liegt und nicht auf die Funktion bezogen ist, die Sie zeigen? – usr2564301
Verwenden Sie 'int c;' anstelle von 'char c;', da 'fgetc()' ein 'int' zurückgibt, das einen beliebigen Wert enthalten kann, den ein' char' enthalten kann, plus einen zusätzlichen - EOF. –
Es hängt mit der Funktion zusammen. Es geht um \ n, aber ich weiß nicht, wie ich es beheben kann:/ –