/** * Funktionspointer verwenden * * Schreiben Sie eine Funktion `print_data`, der eine Liste * von Strings und eine Ausgabefunktion als Funktionspointer * übergeben wird. `print_data` läuft über die Strings und * übergibt diese dann der Ausgabefunktion für die eigentliche * Ausgabe. * * Schreiben Sie zwei verschiedene Ausgabefunktionen: * * - `to_console` welche den String einfach auf der Konsole ausgibt und * - `to_console_ucase` welche den String auf der Konsole ausgibt * aber vorher in Großbuchstaben umwandelt. * * Testen Sie Ihr Programm mit `print_data` und beiden Ausgabefunktionen. */ #include #include #include #include // Funktionspointer-Typ für Ausgabefunktionen typedef void (*OutputFunction)(const char*); // Funktion, die die Datenliste durchläuft und die angegebene Ausgabefunktion aufruft void print_data(const char* data[], int count, OutputFunction outputFunc) { for (int i = 0; i < count; i++) { outputFunc(data[i]); } } char *to_uppercase(const char *lower) { int len = strlen(lower); // Allocate space for new string char *upper = (char *) malloc(sizeof(char) * (len + 1)); // Add null terminator to string upper[len] = '\0'; // Convert characters to uppercase one by one for (int i = 0; i < len; i++) { upper[i] = toupper(lower[i]); } return upper; } // Ausgabefunktion, die die Daten auf der Konsole ausgibt void to_console(const char* data) { printf("%s\n", data); } // Ausgabefunktion, die die Daten in eine Datei schreibt void to_console_ucase(const char* data) { char *ucase = to_uppercase(data); to_console(ucase); free(ucase); } int main() { const char* data[] = { "Daten 1", "Daten 2", "Daten 3" }; int count = sizeof(data) / sizeof(data[0]); // Funktionszeiger für Konsolenausgabe print_data(data, count, to_console); // Funktionszeiger für Dateiausgabe print_data(data, count, to_console_ucase); return 0; }