From ea24c9150108f1adce217816aa52d781d413164b Mon Sep 17 00:00:00 2001 From: alexchilab Date: Thu, 8 May 2025 15:38:43 +0200 Subject: [PATCH] Program: 27.2.c --- 27.2.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 27.2.c diff --git a/27.2.c b/27.2.c new file mode 100644 index 0000000..626a808 --- /dev/null +++ b/27.2.c @@ -0,0 +1,56 @@ +#include +#include //malloc und free + +void ausgabe_liste(const char **listen) //Array von (listen) als Parameter +{ + for (int i = 0; i < 10; i++) //Schleife geht von 0-9 - Gibt jedes Element des Arrays mit Position aus + { + printf("%d: %s\n", i, listen[i]); //Gibt die Nummer und die dazugehörige Liste aus, springt in die nächste Zeile + } +} + + +void strichliste_erstellen(char **listen, int *zaehler) //Ein Array von Zeichenketten (listen) und eins von Zählern (zaehler) +{ + char eingabe; //speichert die eingegebene Zahl + int index = 0; //Welcher Zähler aktualisiert werden soll + int laenge = 0; //Die Länge des neuen Strich-Strings + char *neuerSpeicher; //Platzhalter für den neuen Speicher + + printf("Gib Zahlen ein von 0-9: \n"); + + while ((eingabe = getchar()) != EOF && eingabe != '\n') //getchar liest Zeichen vom Benutzer bis entweder EndOfFile oder \n erkannt wird + { + if (eingabe >= '0' && eingabe <= '9') //Prüft ob dieEingabe eine Ziffer ist zwischen 0 und 9 + { + index = eingabe - '0'; //Wandelt das entsprechende Zeichen in die Zahl um + zaehler[index]++; //Erhöht den Zähler für die eingegebene Zahl '0' --> 0 + laenge = zaehler[index] + 1; //Anzahl der Striche +1 für das 0-Zeichen, dass das Ende markiert + + neuerSpeicher = (char *)malloc(laenge); //Reserviert Speicher für den neuen Text: char* wandelt den Rückgabewert von malloc in einen Zeichenzeiger um + snprintf(neuerSpeicher, laenge, "%s|", listen[index]); //snprintf erstellt den neuen Text: %s| fügt den alten Text und einen neuen Strich zusammen + free(listen[index]); //gibt den alten Speicher frei, damit nichts belegt bleibt + listen[index] = neuerSpeicher; //Speichert neuen Text in der Liste + } + } +} + +int main() +{ + int zaehler[10]; //Array für die Zähler (jede Zahl von 0 bis 9) + char **strichlisten = (char **)malloc(10 * sizeof(char *)); //Array von Zeichenketten für Strichlisten: Reserviert Platz für 10 Zeichenketten (eine für jede Zahl) + + for (int i = 0; i < 10; i++) //durchläuft 10 mal, da 10 Zähler und Strichlisten jeweils gebraucht werden + { + strichlisten[i] = (char *)malloc(1); //malloc reserviert 1 Byte für jeden Eintrag in der Strichliste, char* wandelt den Rückgabewert von malloc in einen Zeiger auf Zeichen (char *) um + strichlisten[i][0] = '\0'; //greift auf das erste (und einzige) Zeichen der gerade reservierten Zeichenkette zu, Nullzeichen: Zeichenkette leer, aber gültig + zaehler[i] = 0; //setzt Zähler auf 0, damit man weiss dass für diese Zahl noch keine Striche hinzugefügt wurden + } + + strichliste_erstellen(strichlisten, zaehler); + ausgabe_liste((const char **)strichlisten); //ruft die Funktionen auf, um die Listen zu erstellen und anzuzeigen + + free(strichlisten); //gibt den Hauptspeicher der Listen frei + + return 0; +} \ No newline at end of file