/* AUFGABENSTELLUNG (T04, 25Oct22) * * Programm schreiben, welches Eingabe zeichenweise nach * Groß/Kleinschreibung konvertiert ausgibt Eingaben werden von stdin * eingelesen * * - Eingabeformat: 'u'/'l' * - Ausgabe: alle Zeichen der Eingabe als Großf('u')- bzw. * - Kleinbuchstaben('l') */ #include #include #include #include int main() { int mode = fgetc(stdin); /* Das erste Zeichen der Eingabe regelt den Eingabe-Modus. Da * wir hier eine "Ressource" benutzen, muss auf mögliche Fehler * beim Einlesen der Nachricht geachtet werden. * * ACHTUNG: Der Rückgabetyp von `fgetc' ist "int", nicht "char", * da alle "char"s gültige Werte sind! */ if (mode == EOF) { perror("fgetc"); exit(EXIT_FAILURE); } /* Wir benutzen den Typ "bool" aus stdbool.h um abzuspeichern in * welchem Modus wir uns befinden. */ bool up; switch (mode) { case 'u': up = true; break; case 'd': up = false; break; default: fprintf(stderr, "Invalid mode\n"); exit(EXIT_FAILURE); } /* Wir müssen nun den Rest der Eingabe verarbeiten, und es wäre * möglich in der Schleife nach dem einlesen von jedem Zeichen * (oder Zeile) alle zeichen groß oder klein zu schreiben, indem * man bspw. prüft ob es `c' ein Großbuchstabe ist ('A' <= c && c * <= 'Z'), und den analogen Kleinbuchstaben berechnet (c + ('a' * - 'A')). * * Stattdessen benutzen wir die Funktionen `toupper' und * `tolower', welche diese Funktionalität bereits implementieren. * Anstatt innerhalb der Schleife immer `up' zu prüfen, werden * wir ein Funktionspointer benutzen! Wir bestimmen welche * Funktion wir benutzen wollen mit einem Conditional-Operator * (wenn "up" nicht-`false' ist, dann `toupper' ansonsten * `tolower'). */ int (*f)(int c) = up ? toupper : tolower; int c; while ((c = fgetc(stdin)) != EOF) { int err; /* Es ist streng genommen nicht notwendig `f' zu * dereferenzieren, oder die Variable `err' anzulegen, aber * wir machen es aus gründen der Lesbarkeit. */ err = fputc((*f)(c), stdout); if (err == EOF) { perror("fputc"); exit(EXIT_FAILURE); } } /* Wie in SP1 wollen wir sicherstellen das unser Ausgabe-Buffer * gelehrt wurde, und falls nicht eine Fehlermeldung ausgeben. */ if (EOF == fflush(stdout)) { perror("fflush"); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS); }