2012-03-25 12 views
2

Ich muss eine Funktion herstellen, die zwei Strings verkettet, aber ich muss ein '\ n' nach dem ersten Wort hinzufügen. Ich habe alles herausgefunden, und aus irgendeinem Grund gibt es nichts aus. Irgendwelche Ideen? Es muss wahrscheinlich etwas mit den Zeigern machen. Ich kann mich einfach nicht um sie kümmern. Hier ist der Code.Funktion druckt das Ergebnis nicht aus

char *function(char *s1, char *s2){ 
    char *newStr; 
    int size; 
    size = strlen(s1) + strlen(s2); 

    newStr = (char *)malloc((size+1)*sizeof(char)); 

    while(*s1!= '\0'){ 
     *newStr = *s1; 
     newStr++; 
     s1++; 
    } 
    *newStr = '\n'; 
    newStr++; 
    while(*s2 != '\0'){ 
     *newStr = *s2; 
     newStr++; 
     s2++; 
    } 
    *newStr = '\0'; 
return newStr; 
} 

int main (int argc, const char * argv[]) { 
    char *str1 = "Hello"; 
    char *str2 = "World"; 

    printf("%s",function(str1, str2)); 

    return 0; 
} 

So als Ergebnis sollte ich:

Hello 
World 

aber ich bin nicht etwas zurückbekommen.

Antwort

4

Sie geben einen Zeiger auf das Ende des Puffers statt einen Zeiger auf den Anfang des Puffers zurück. Blick auf den letzten beiden Zeilen der Funktion:

*newStr = '\0'; 
return newStr; 

Offensichtlich Dies gibt einen Zeiger auf die Null char, das heißt den leeren String.

Lösen Sie das Problem, indem Sie einen temporären Zeiger einführen, mit dem Sie den Ausgabepuffer durchlaufen können. Dann können Sie den Zeiger an den Anfang des Ausgabepuffers zurückgeben.

char *function(char *s1, char *s2){ 
    int size = strlen(s1) + strlen(s2) + 2;//one for '\n', one for '\0' 
    char *result = malloc(size); 
    char *p = result; 

    while(*s1 != '\0'){ 
     *p = *s1; 
     p++; 
     s1++; 
    } 
    *p = '\n'; 
    p++; 
    while(*s2 != '\0'){ 
     *p = *s2; 
     p++; 
     s2++; 
    } 
    *p = '\0'; 

    return result; 
} 

Sie müssen auch ein zusätzliches Zeichen für die \n zuzuteilen, wie oben gezeigt. Schließlich gibt Ihr Aufrufcode niemals den von function zugewiesenen Speicher frei.

+0

Es ist immer noch nicht, ich habe eine Warnung an * p erhalten = Ergebnis sagen funktioniert „Zuordnung macht Ganzzahl ohne Besetzung von Zeiger.“ – captain

+0

Nein, es funktioniert gut. Sie müssen falsch kopiert haben. Zum Beispiel: http://ideone.com/jQhMj –

0

Ich würde einen Blick auf zwei Dinge nehmen:

  • wie viel Platz Sie für die neue Zeichenfolge sind die Zuteilung und vergleichen Sie das mit, wie viele Zeichen Sie schreiben tatsächlich zu dieser Zeichenfolge.
  • In dem String, auf den der zurückgegebene Zeiger verweist.
0

Sie kehren von function() einen Zeiger auf das letzte Element in der zugewiesenen char[] - statt den Zeiger auf das erste Element zurück.

Jedes Mal, wenn Sie newStr++; tun, erhöhen Sie den tatsächlichen Zeiger, den Sie später zurückgeben. zu lösen, es können Sie eine davon tun:

  1. schaffen es die gleichen wie newStr und erhöhen werden initialisiert wird eine Kopie des Zeigers newStr, die - verlassen newStr wie es ist.
  2. Erstellen Sie einen Index [lassen Sie es i] und erhöhen Sie es, und verwenden Sie newStr[i], um auf das zugeordnete Array zuzugreifen.
0

Ich habe den Code für Sie debugged. Hier ist der Code debuggt:

char *function(char *s1, char *s2) { 
    char *newStr, *str; 
    int size; 
    size = strlen(s1) + strlen(s2); 

    newStr = (char *) malloc((size + 2) * sizeof(char)); 
    str = newStr; 
    while (*s1 != '\0') { 
     *(newStr++) = *(s1++); 
    } 
    *newStr = '\n'; 
    newStr++; 
    while (*s2 != '\0') { 
     *newStr = *s2; 
     newStr++; 
     s2++; 
    } 
    *newStr = '\0'; 
    return str; 
} 

int main(int argc, const char *argv[]) { 
    char *str1 = "Hello"; 
    char *str2 = "World"; 

    printf("%s", function(str1, str2)); 

    return 0; 
} 

Das eigentliche Problem war, dass, wie Sie newstr bis zur letzten erhöht, wenn Sie es von function() kehrte er nach dem Ende des Puffers zeigte. dh '\0'. Deshalb ist es nicht aufgetaucht. Jetzt Im obigen Code habe ich eine Variable str eingeführt, die auf den Anfang der Zeichenfolge newStr zeigt.

Hoffnung, die Sie verstehen ..

Frieden ...

Verwandte Themen