Antwort mit KI erzeugt
Analyse des gegebenen Codes
Bevor wir den korrekten Code besprechen, ist es wichtig zu verstehen, warum der gegebene Code nicht funktioniert. Der ursprüngliche Ansatz hat mehrere Probleme:
1. Die Verwendung von
calloc
reserviert nicht ausreichend Speicher. Der reservierte Speicherplatz muss lang genug sein, um den wiederholten String zu speichern. Das bedeutet, man braucht "
strlen(str) * times + 1
" Zeichen (einschließlich des Null-Terminators).
2. Die rekursive Aufruflogik ist unnötig und fehlerhaft. Anstatt die Funktion rekursiv aufzurufen, sollte der Zweck des Wiederholens direkt in der Schleifenlogik erfüllt werden.
3. Die Funktion versucht, einen Pointer auf einen lokalen Speicherbereich zu retournieren, der innerhalb der Funktion alloziert wurde, was an sich korrekt ist. Allerdings gibt es keinen gültigen Rückgabewert, falls die Funktion erfolgreich durchläuft (die Funktion gibt versehentlich
0
zurück anstatt von
ret
).
Korrekter Ansatz
Um die Funktion
repeat
korrekt zu schreiben, sollten wir den Kern der Logik folgendermaßen implementieren:
- Zuerst berechnen wir die Länge des Eingabestrings und reservieren ausreichend Speicherplatz für das Ergebnis.
- Dann fügen wir wiederholt den Eingabestring in den reservierten Speicherbereich ein.
- Schließlich geben wir den Zeiger auf den neuen String zurück.
Korrigierter Code
c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *repeat(char *str, int times) {
if(times <= 0) {
// Reservieren von Speicher für leeren String
char *ret = calloc(1, sizeof(char));
*ret = '\0'; // Ein leeres String
return ret;
}
int len = strlen(str);
char *ret = calloc(len * times + 1, sizeof(char));
for(int i = 0; i < times; i++) {
strcat(ret, str);
}
return ret;
}
int main() {
char *str = "Tag";
int times = 4;
char *result = repeat(str, times);
printf("%s\n", result);
free(result); // Wichtig: Gib den reservierten Speicher frei
return 0;
}
Erläuterungen zum Code:
-
strlen(str)
berechnet die Länge des Eingabestrings.
-
calloc(len * times + 1, sizeof(char))
reserviert ausreichend Speicherplatz für die Wiederholungen plus ein Zeichen für den Null-Terminator.
- In der Schleife fügen wir den Eingabestring mit
strcat(ret, str)
wiederholt in das Ergebnis ein.
- Der Speicher, der mit
calloc
reserviert wurde, muss mit
free(result)
wieder freigegeben werden, um Speicherlecks zu vermeiden.
- Beachten Sie, dass wir eine Prüfung auf nicht-positive Wiederholungen hinzugefügt haben, um einen defensiven Programmieransatz zu verfolgen.