diff --git a/Start_Windows/.vscode/c_cpp_properties.json b/Start_Windows/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..9a75488 --- /dev/null +++ b/Start_Windows/.vscode/c_cpp_properties.json @@ -0,0 +1,18 @@ +{ + "configurations": [ + { + "name": "windows-gcc-x64", + "includePath": [ + "${workspaceFolder}/**" + ], + "compilerPath": "C:/msys64/mingw64/bin/gcc.exe", + "cStandard": "${default}", + "cppStandard": "${default}", + "intelliSenseMode": "windows-gcc-x64", + "compilerArgs": [ + "" + ] + } + ], + "version": 4 +} \ No newline at end of file diff --git a/Start_Windows/.vscode/launch.json b/Start_Windows/.vscode/launch.json new file mode 100644 index 0000000..dbc52e7 --- /dev/null +++ b/Start_Windows/.vscode/launch.json @@ -0,0 +1,24 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "C/C++ Runner: Debug Session", + "type": "cppdbg", + "request": "launch", + "args": [], + "stopAtEntry": false, + "externalConsole": true, + "cwd": "d:/Dokumente/Info2_PIA/Info2V/Start_Windows", + "program": "d:/Dokumente/Info2_PIA/Info2V/Start_Windows/build/Debug/outDebug", + "MIMode": "gdb", + "miDebuggerPath": "gdb", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ] + } + ] +} \ No newline at end of file diff --git a/Start_Windows/.vscode/settings.json b/Start_Windows/.vscode/settings.json new file mode 100644 index 0000000..bb879da --- /dev/null +++ b/Start_Windows/.vscode/settings.json @@ -0,0 +1,59 @@ +{ + "C_Cpp_Runner.cCompilerPath": "gcc", + "C_Cpp_Runner.cppCompilerPath": "g++", + "C_Cpp_Runner.debuggerPath": "gdb", + "C_Cpp_Runner.cStandard": "", + "C_Cpp_Runner.cppStandard": "", + "C_Cpp_Runner.msvcBatchPath": "C:/Program Files/Microsoft Visual Studio/VR_NR/Community/VC/Auxiliary/Build/vcvarsall.bat", + "C_Cpp_Runner.useMsvc": false, + "C_Cpp_Runner.warnings": [ + "-Wall", + "-Wextra", + "-Wpedantic", + "-Wshadow", + "-Wformat=2", + "-Wcast-align", + "-Wconversion", + "-Wsign-conversion", + "-Wnull-dereference" + ], + "C_Cpp_Runner.msvcWarnings": [ + "/W4", + "/permissive-", + "/w14242", + "/w14287", + "/w14296", + "/w14311", + "/w14826", + "/w44062", + "/w44242", + "/w14905", + "/w14906", + "/w14263", + "/w44265", + "/w14928" + ], + "C_Cpp_Runner.enableWarnings": true, + "C_Cpp_Runner.warningsAsError": false, + "C_Cpp_Runner.compilerArgs": [], + "C_Cpp_Runner.linkerArgs": [], + "C_Cpp_Runner.includePaths": [], + "C_Cpp_Runner.includeSearch": [ + "*", + "**/*" + ], + "C_Cpp_Runner.excludeSearch": [ + "**/build", + "**/build/**", + "**/.*", + "**/.*/**", + "**/.vscode", + "**/.vscode/**" + ], + "C_Cpp_Runner.useAddressSanitizer": false, + "C_Cpp_Runner.useUndefinedSanitizer": false, + "C_Cpp_Runner.useLeakSanitizer": false, + "C_Cpp_Runner.showCompilationTime": false, + "C_Cpp_Runner.useLinkTimeOptimization": false, + "C_Cpp_Runner.msvcSecureNoWarnings": false +} \ No newline at end of file diff --git a/Start_Windows/input.c b/Start_Windows/input.c index ed77805..177f1bb 100644 --- a/Start_Windows/input.c +++ b/Start_Windows/input.c @@ -2,11 +2,127 @@ #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 der Datei in 'buffer' +// Rückgabe: 1 = Wort gelesen, 0 = kein Wort mehr (EOF oder Fehler) +// +static int readSingleWord(FILE *file, char *buffer, size_t bufferSize) +{ + // (1) Lokale Variablen: c = aktuelles Zeichen, len = Länge des Wortes im Buffer + int c; + size_t len = 0; -// Read words from file and store in 'words' array + // (2) Sicherheitscheck: sind die Parameter überhaupt gültig? + if (file == NULL || buffer == NULL || bufferSize == 0) + { + return 0; + } + + // (3) Führende Trennzeichen überspringen + // -> solange nur Komma, Semikolon oder Whitespace kommt, weiter lesen + while ((c = fgetc(file)) != EOF) + { + if (c == ',' || c == ';' || isspace((unsigned char)c)) + { + continue; // Trennzeichen -> noch kein Wort + } + else + { + break; // erstes Nicht-Trennzeichen -> Start des Wortes + } + } + + // (4) Wenn direkt EOF kommt, bevor ein Wort beginnt: kein Wort mehr vorhanden + if (c == EOF) + { + return 0; + } + + // (5) Ersten Buchstaben des Wortes in den Buffer schreiben + buffer[len++] = (char)c; + + // (6) Rest des Wortes lesen, bis wieder ein Trennzeichen oder EOF kommt + while ((c = fgetc(file)) != EOF) + { + // Trennzeichen: Wort ist zu Ende + if (c == ',' || c == ';' || isspace((unsigned char)c)) + { + break; + } + + // (7) Nur schreiben, solange noch Platz ist (für das abschließende '\0') + if (len < bufferSize - 1) + { + buffer[len++] = (char)c; + } + // Wenn kein Platz mehr ist, werden die restlichen Zeichen des Wortes ignoriert + } + + // (8) String terminieren: am Ende ein '\0' setzen, damit es ein gültiger C-String ist + buffer[len] = '\0'; + + // (9) 1 zurückgeben: es wurde erfolgreich ein Wort gelesen + return 1; +} + +// +// HAUPTFUNKTION: liest ALLE Wörter aus der Datei und speichert sie im Array 'words' +// Rückgabe: wie viele Wörter tatsächlich eingelesen wurden +// int readWords(FILE *file, char words[][MAX_WORD_LEN], unsigned int maxWordCount) { + // (1) Zähler, wie viele Wörter bereits eingelesen wurden + unsigned int count = 0; -} \ No newline at end of file + // (2) Temporärer Puffer für EIN Wort + char buffer[MAX_WORD_LEN]; + + // (3) Sicherheitscheck: Datei, Ziel-Array und maxWordCount prüfen + if (file == NULL || words == NULL || maxWordCount == 0) + { + return 0; + } + + // (4) Hauptschleife: + // Solange noch Platz im words-Array ist + // UND readSingleWord() noch ein Wort liefert + while (count < maxWordCount && readSingleWord(file, buffer, sizeof(buffer))) + { + // (5) Wort aus dem Buffer sicher ins nächste freie Feld von 'words' kopieren + // -> words[count] ist der nächste freie Platz + strncpy(words[count], buffer, MAX_WORD_LEN); + + // (6) Zur Sicherheit: letztes Zeichen auf '\0' setzen (falls Wort zu lang war) + words[count][MAX_WORD_LEN - 1] = '\0'; + + // (7) Zähler erhöhen -> nächstes Wort kommt in words[count+1] + count++; + } + + // (8) Anzahl der eingelesenen Wörter an den Aufrufer (z.B. main) zurückgeben + return count; +} + + + + + +//Erklärung des Codes für Präsentation: + +//In main wird eine Datei geöffnet und ein zweidimensionales Array words angelegt. +//Dann wird unsere Funktion readWords(file, words, MAX_NUMBER_OF_WORDS) aufgerufen. + +//In readWords haben wir zuerst einen Zähler count, der mitzählt, wie viele Wörter wir schon eingelesen haben, und einen temporären Buffer für ein einzelnes Wort. +//Danach kommt eine while-Schleife: +//while (count < maxWordCount && readSingleWord(file, buffer, sizeof(buffer))) +//Die Schleife läuft so lange, wie noch Platz im Array ist und unsere Hilfsfunktion readSingleWord immer wieder ein neues Wort aus der Datei liefert. + +//readSingleWord kümmert sich nur darum, ein einzelnes Wort zu lesen: +//Sie überspringt erst alle Trennzeichen wie Kommas, Semikolons oder Leerzeichen, +//merkt sich dann das erste Nicht-Trennzeichen als Wortanfang und liest so lange weiter, bis wieder ein Trennzeichen kommt oder die Datei zu Ende ist. +//Das gelesene Wort landet im buffer und wird mit '\0' beendet. +//Wenn ein Wort gefunden wurde, gibt readSingleWord 1 zurück, sonst 0. + +//Zurück in readWords wird jedes Wort aus dem Buffer mit strncpy in das Array words[count] kopiert. +//Danach wird count erhöht, sodass das nächste Wort an die nächste freie Stelle geschrieben wird. +//Wenn keine Wörter mehr gelesen werden können, gibt readWords die Gesamtzahl der eingelesenen Wörter zurück. \ No newline at end of file diff --git a/Start_Windows/test_runner.exe b/Start_Windows/test_runner.exe new file mode 100644 index 0000000..a1691e8 Binary files /dev/null and b/Start_Windows/test_runner.exe differ