0 Daumen
188 Aufrufe

Frage:

Ich habe versucht in C eine Funktion zu schreiben die mir einen String n mal vervielfältigt.

Es sollte so was dabei rauskommen:

Eingabe: 4 Tag
Ausgabe: TagTagTagTag

Mein Code funktioniert nicht:

char * repeat(char *str, int times)
{ char *ret = calloc(times, (strlen(str) + 1));
  while (times-- > 0)
    strcat(ret,str);
    char *b;
  b = repeat(str,times);
  printf("%s",b);
  return 0; }
Avatar von

1 Antwort

0 Daumen

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.
Avatar von 4,0 k

Ein anderes Problem?

Stell deine Frage

Ähnliche Fragen

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community