#include "input.h" #include #include /* * ------------------------------------------------------------ * HILFSFUNKTION: * Liest genau EIN Wort aus einer Datei und speichert es in 'buffer'. * * - Trennt Wörter anhand von Komma, Semikolon oder Leerzeichen. * - Wandelt alle Buchstaben in GROSSBUCHSTABEN um (damit Tests passen). * - Gibt 1 zurück, wenn ein Wort gefunden wurde. * - Gibt 0 zurück, wenn nichts mehr zu lesen ist (EOF oder Fehler). * ------------------------------------------------------------ */ static int readSingleWord(FILE *file, char *buffer, size_t bufferSize) { int c; // aktuelles Zeichen aus der Datei size_t len = 0; // Anzahl der bisher eingelesenen Zeichen im aktuellen Wort // --- Sicherheitsprüfung: Sind die Übergabeparameter gültig? --- if (file == NULL || buffer == NULL || bufferSize == 0) { return 0; // nichts tun, wenn Datei oder Speicher ungültig ist } // --- 1. Führende Trennzeichen überspringen --- // Solange Kommas, Semikolons oder Leerzeichen kommen, einfach weiter lesen. // Erst wenn ein anderes Zeichen kommt, fängt das Wort an. while ((c = fgetc(file)) != EOF) { if (c == ',' || c == ';' || isspace((unsigned char)c)) { continue; // noch kein Buchstabe -> weiter zum nächsten Zeichen } else { break; // erstes Nicht-Trennzeichen gefunden -> Wort beginnt hier } } // --- 2. Falls direkt EOF (End of File) erreicht wurde, kein Wort mehr vorhanden --- if (c == EOF) { return 0; } // --- 3. Erstes Zeichen des Wortes in den Buffer schreiben --- // Dabei gleich in Großbuchstaben umwandeln char upperChar = (char) toupper((unsigned char) c); buffer[len++] = upperChar; // --- 4. Rest des Wortes lesen, bis ein Trennzeichen oder das Dateiende erreicht ist --- while ((c = fgetc(file)) != EOF) { // Wenn Komma, Semikolon oder Leerzeichen -> Wort ist zu Ende if (c == ',' || c == ';' || isspace((unsigned char)c)) { break; } // Nur schreiben, solange noch Platz im Buffer ist (letztes Zeichen für '\0' reservieren!) if (len < bufferSize - 1) { upperChar = (char) toupper((unsigned char) c); // Zeichen in Großbuchstaben buffer[len++] = upperChar; // Zeichen im Buffer speichern } // Wenn kein Platz mehr, restliche Zeichen ignorieren (Vermeidung von Speicherfehlern) } // --- 5. String beenden --- buffer[len] = '\0'; // Nullterminator am Ende -> macht aus dem Array einen C-String // --- 6. Erfolg melden --- return 1; // 1 = Wort erfolgreich eingelesen } /* * ------------------------------------------------------------ * HAUPTFUNKTION: * Liest ALLE Wörter aus einer Datei und speichert sie in 'words'. * * - Ruft die Hilfsfunktion 'readSingleWord()' mehrfach auf, * um ein Wort nach dem anderen zu lesen. * - Kopiert jedes gefundene Wort in das große 'words'-Array. * - Zählt, wie viele Wörter tatsächlich gefunden wurden. * ------------------------------------------------------------ */ int readWords(FILE *file, char words[][MAX_WORD_LEN], unsigned int maxWordCount) { unsigned int count = 0; // zählt, wie viele Wörter gefunden wurden char buffer[MAX_WORD_LEN]; // Zwischenspeicher für EIN Wort (kommt aus der Hilfsfunktion) // --- Sicherheitsprüfung --- // Datei darf nicht NULL sein, das Array muss existieren, und es muss Platz vorhanden sein. if (file == NULL || words == NULL || maxWordCount == 0) { return 0; // ungültige Eingaben -> keine Wörter gelesen } // --- Hauptschleife --- // Solange: // - noch Platz im 'words'-Array ist (count < maxWordCount) // - UND readSingleWord() ein neues Wort liefern kann while (count < maxWordCount && readSingleWord(file, buffer, sizeof(buffer))) { // --- 1. Wort aus dem Buffer ins große Array kopieren --- // strcpy wäre unsicher -> strncpy schützt vor Überlauf strncpy(words[count], buffer, MAX_WORD_LEN); // --- 2. Sicherstellen, dass das Wort immer korrekt endet --- // Wenn das Wort genau MAX_WORD_LEN Zeichen lang war, // könnte der '\0' durch strncpy fehlen -> hier wird er garantiert gesetzt. words[count][MAX_WORD_LEN - 1] = '\0'; // --- 3. Zähler erhöhen -> nächstes Wort kommt in words[count+1] --- count++; } // --- Schleife beendet: entweder kein Wort mehr oder Array ist voll --- // Rückgabe: Anzahl der tatsächlich eingelesenen Wörter return count; }