This commit is contained in:
Bora Zuenbuelkoek 2025-05-05 16:01:12 +02:00
parent 97d3228fcf
commit 2b748acdf5

View File

@ -2,54 +2,55 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#define NUM_DIGITS 10 #define NUM_DIGITS 10 // Es gibt 10 Ziffern: 0 bis 9
int main(void) { int main(void) {
char *strichlisten[NUM_DIGITS] = {NULL}; char *strichlisten[NUM_DIGITS] = {NULL}; // Array für die Strichlisten-Strings, einer pro Ziffer
int counts[NUM_DIGITS] = {0}; int counts[NUM_DIGITS] = {0}; // Zählt, wie oft jede Ziffer vorkommt
int c; int c; // Variable für das aktuell eingelesene Zeichen
// Initialisiere alle Strichlisten als leere Strings // Initialisiere alle Strichlisten als leere Strings
for (int i = 0; i < NUM_DIGITS; ++i) { for (int i = 0; i < NUM_DIGITS; ++i) {
strichlisten[i] = malloc(1); strichlisten[i] = malloc(1); // Reserviere 1 Byte für den leeren String ('\0')
if (!strichlisten[i]) { if (!strichlisten[i]) { // Prüfe, ob Speicher reserviert werden konnte
fprintf(stderr, "Speicherfehler!\n"); fprintf(stderr, "Speicherfehler!\n"); // Fehlermeldung ausgeben
// Speicher aufräumen // Bereits reservierten Speicher wieder freigeben
for (int j = 0; j < i; ++j) free(strichlisten[j]); 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) { while ((c = getchar()) != EOF) {
if (c >= '0' && c <= '9') { if (c >= '0' && c <= '9') { // Prüfe, ob das Zeichen eine Ziffer ist
int idx = c - '0'; int idx = c - '0'; // Rechne das Zeichen in eine Zahl um (z.B. '3' -> 3)
counts[idx]++; 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]); 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); char *neu = malloc(oldlen + 2);
if (!neu) { if (!neu) { // Prüfe, ob Speicher reserviert werden konnte
fprintf(stderr, "Speicherfehler!\n"); fprintf(stderr, "Speicherfehler!\n");
// Speicher aufräumen // Speicher aufräumen
for (int j = 0; j < NUM_DIGITS; ++j) free(strichlisten[j]); for (int j = 0; j < NUM_DIGITS; ++j) free(strichlisten[j]);
return 1; return 1;
} }
strcpy(neu, strichlisten[idx]); strcpy(neu, strichlisten[idx]); // Kopiere den alten String in den neuen Speicher
neu[oldlen] = '|'; neu[oldlen] = '|'; // Füge einen Strich ans Ende an
neu[oldlen+1] = '\0'; neu[oldlen+1] = '\0'; // Setze das String-Ende
free(strichlisten[idx]); free(strichlisten[idx]); // Gib den alten Speicher frei
strichlisten[idx] = neu; 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) { for (int i = 0; i < NUM_DIGITS; ++i) {
printf("%d: %d %s\n", i, counts[i], strichlisten[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
} }