c-uebungen/Assignment_019/solution/function_pointer.c

74 lines
2.0 KiB
C

/**
* 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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
// 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;
}