From 2b748acdf573bf8c532760dc1b1b0cc5e063bbce Mon Sep 17 00:00:00 2001 From: Bora Date: Mon, 5 May 2025 16:01:12 +0200 Subject: [PATCH] halo --- strilist.c | 51 ++++++++++++++++++++++++++------------------------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/strilist.c b/strilist.c index e6cef4e..5e4d895 100644 --- a/strilist.c +++ b/strilist.c @@ -2,54 +2,55 @@ #include #include -#define NUM_DIGITS 10 +#define NUM_DIGITS 10 // Es gibt 10 Ziffern: 0 bis 9 int main(void) { - char *strichlisten[NUM_DIGITS] = {NULL}; - int counts[NUM_DIGITS] = {0}; - int c; + char *strichlisten[NUM_DIGITS] = {NULL}; // Array für die Strichlisten-Strings, einer pro Ziffer + int counts[NUM_DIGITS] = {0}; // Zählt, wie oft jede Ziffer vorkommt + int c; // Variable für das aktuell eingelesene Zeichen // Initialisiere alle Strichlisten als leere Strings for (int i = 0; i < NUM_DIGITS; ++i) { - strichlisten[i] = malloc(1); - if (!strichlisten[i]) { - fprintf(stderr, "Speicherfehler!\n"); - // Speicher aufräumen + strichlisten[i] = malloc(1); // Reserviere 1 Byte für den leeren String ('\0') + if (!strichlisten[i]) { // Prüfe, ob Speicher reserviert werden konnte + fprintf(stderr, "Speicherfehler!\n"); // Fehlermeldung ausgeben + // Bereits reservierten Speicher wieder freigeben for (int j = 0; j < i; ++j) free(strichlisten[j]); - return 1; + return 1; // Programm mit Fehlercode beenden } - strichlisten[i][0] = '\0'; + strichlisten[i][0] = '\0'; // Setze den String auf leer (nur das Endzeichen) } - // Einlesen der Ziffern + // Lese Zeichen ein, bis das Dateiende (EOF) erreicht ist while ((c = getchar()) != EOF) { - if (c >= '0' && c <= '9') { - int idx = c - '0'; - counts[idx]++; + if (c >= '0' && c <= '9') { // Prüfe, ob das Zeichen eine Ziffer ist + int idx = c - '0'; // Rechne das Zeichen in eine Zahl um (z.B. '3' -> 3) + counts[idx]++; // Zähle die Ziffer mit - // Länge des alten Strings + // Ermittle die Länge des bisherigen Strichlisten-Strings size_t oldlen = strlen(strichlisten[idx]); - // Speicher für neuen String (+1 für neuen Strich, +1 für '\0') + // Reserviere neuen Speicher: alter String + 1 Strich + 1 für '\0' char *neu = malloc(oldlen + 2); - if (!neu) { + if (!neu) { // Prüfe, ob Speicher reserviert werden konnte fprintf(stderr, "Speicherfehler!\n"); // Speicher aufräumen for (int j = 0; j < NUM_DIGITS; ++j) free(strichlisten[j]); return 1; } - strcpy(neu, strichlisten[idx]); - neu[oldlen] = '|'; - neu[oldlen+1] = '\0'; - free(strichlisten[idx]); - strichlisten[idx] = neu; + strcpy(neu, strichlisten[idx]); // Kopiere den alten String in den neuen Speicher + neu[oldlen] = '|'; // Füge einen Strich ans Ende an + neu[oldlen+1] = '\0'; // Setze das String-Ende + free(strichlisten[idx]); // Gib den alten Speicher frei + strichlisten[idx] = neu; // Setze den neuen String als aktuelle Strichliste } + // Alle anderen Zeichen werden ignoriert } - // Ausgabe + // Gib für jede Ziffer die Anzahl und die Strichliste aus for (int i = 0; i < NUM_DIGITS; ++i) { printf("%d: %d %s\n", i, counts[i], strichlisten[i]); - free(strichlisten[i]); + free(strichlisten[i]); // Speicher für die Strichliste freigeben } - return 0; + return 0; // Programm erfolgreich beenden } \ No newline at end of file