From 80fd4e832aecdd8ebab9a34fb569acd41ed9d09b Mon Sep 17 00:00:00 2001 From: Pia Keil Date: Wed, 5 Nov 2025 15:41:36 +0100 Subject: [PATCH] Update input.c und input.h aus Branch Pia (getestet, keine Warnungen) --- Start_Windows/input.c | 119 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 115 insertions(+), 4 deletions(-) diff --git a/Start_Windows/input.c b/Start_Windows/input.c index 9e9452f..c82ed47 100644 --- a/Start_Windows/input.c +++ b/Start_Windows/input.c @@ -2,11 +2,122 @@ #include #include -// TODO: -// eine Funktion implementieren, die ein einzelnes Wort aus einer Textdatei (words.txt) einliest und als C-String zurückgibt. +/* + * ------------------------------------------------------------ + * 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 -// Read words from file and store in 'words' array + // --- 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) { - return 0; + 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; } \ No newline at end of file