2016-04-15 6 views
-1

Ich versuche, eine benutzerdefinierte Funktion in C zu schreiben, die zwei Zeichenfolgen verketten wird. Bisher habe ich kommen mit:Wie repariert man diese Funktion, so dass sie die Verkettung zweier Strings zurückgibt?

char *strcat406(char *str1, char *str2) { 

    int str1length = 0; 
    int str2length = 0; 
    char newStr[str1length + str2length]; 
    int i; 

    for (i = 0; i < str1[i] != '\0'; i++) 
     str1length += 1; 

    for (i = 0; i < str2[i] != '\0'; i++) 
     str2length += 1; 

    for (i = 0; i < str1[i] != '\0'; i++) 
     newStr[i] = str1[i]; 

    for (i = i; i < str2[i] != '\0'; i++) 
     newStr[i] = str2[i]; 

    return newStr; 

} 

ich den Code glauben, mit Ausnahme der Linie funktionieren sollte, die return newStr; liest, Xcode gibt mir einen Fehler, der „Adresse des Stapelspeichers liest mit lokalen Variablen zugeordnet (x) zurückgegeben "und ich denke, das ist der Grund, warum ich das String-Array nicht in Main gedruckt bekomme, wie ich es will.

Aus meinen Nachforschungen scheint es so zu kommen, weil der Speicher für das zurückgegebene Array freigegeben wird, und so bekomme ich ein Ergebnis, das ich nicht will, obwohl ich keine einzige Antwort auf dieser Site oder sogar in der gefunden habe C Dokumentation, die für mich funktioniert hat.

Wie kann ich meine Funktion so ändern, dass sie die Verkettung zweier Strings zurückgibt?

+0

'obwohl ich nicht eine einzige Antwort auf dieser Seite oder sogar in dem C-Handbuch gefunden habe, die für me.' gearbeitet hat ... mir sagen, warum ich glaube nicht, dass ... –

+0

Ich verstehe deine Frage nicht. –

+1

Also tue ich ......... –

Antwort

2

Sie müssen die Länge der resultierenden Zeichenfolge berechnen, dann den Speicher für sie zuweisen, dann kopieren Sie es und geben Sie es zurück. Sie verwenden jetzt ein VLA. Es ist besser, malloc zu verwenden:

char *strcat406(char *str1, char *str2) { 

    int str1length = 0; 
    int str2length = 0; 
    char *newStr; // note: length not known yet 
    int i, j; 

    for (i = 0; i < str1[i] != '\0'; i++) 
     str1length += 1; 

    for (i = 0; i < str2[i] != '\0'; i++) 
     str2length += 1; 

    newstr= malloc (str1length + str2length + 1); 

    for (i = 0; str1[i] != '\0'; i++) 
     newStr[i] = str1[i]; 

    for (j = 0 ;str2[j] != '\0'; j++) 
     newStr[i+j] = str2[j]; 

    newstr[i+j]= '\0'; 
    return newStr; 
} 

Es ara bessere Möglichkeiten, dies zu tun, aber ich bleib bei deinem Ansatz. Vergessen Sie nicht, die neue Zeichenfolge kostenlos aufzurufen, wenn Sie sie nicht mehr benötigen.

EDIT Die bessere Ansatz Wesen:

char *strcat406(char *str1, char *str2) 
{ 
    char *newStr= malloc(strlen(str1)+strlen(str2)+1); 
    strcpy(newStr,str1); 
    strcat(newStr,str2); 
    return newStr; 
} 
+0

Warum nicht statt der Schleifen einfach 'strcpy (...); strcat (...) '? – alk

+1

@alk, wie ich sage: "Es gibt bessere Möglichkeiten, dies zu tun, aber ich bleibe bei Ihrem Ansatz". Das ist so, er lernt, was mit seiner anfänglichen Annäherung falsch war. –

2

Zwei Dinge

  • sagen, verlassen Sie sich nicht auf VLAs, da sie als optionaler Bestandteil wie von C11-Standard vorgenommen wurden.
  • VLAs müssen nicht im Heap-Speicher zugeordnet werden mindestens der Standard mandatiert nichts.

Einfache Lösung:(I nicht die Verkettung Logik beteiligt überprüfen haben)

newStr Machen Sie einen Zeiger verwenden, dynamische Speicherzuweisung [malloc()/calloc()].

Dynamisch allozierter Speicher bleibt im Gültigkeitsbereich, bis er programmatisch freigegeben wird. Daher sind sie nicht auf den Funktionsumfang beschränkt, in dem sie definiert sind. In der Anruferfunktion müssen Sie den Speicher freigeben, nachdem Sie damit fertig sind.

Verwandte Themen