halo
This commit is contained in:
parent
97d3228fcf
commit
2b748acdf5
51
strilist.c
51
strilist.c
@ -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
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user