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 <string.h>
#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
}