2012-03-25 22 views
2

2つの文字列を連結する関数を作成する必要がありますが、最初の単語の後に '\ n'を追加する必要があります。私はすべてを考え出して何らかの理由で何も印刷しません。何か案は?おそらくポインタで何かをしなければならないでしょう。私はちょうどそれらの周りに私の頭を得ることができません。ここにコードがあります。関数は結果を出力していません

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; 
} 

だから、結果として私が取得する必要があります。

Hello 
World 

が、私は何も戻ってきませんよ。

答えて

4

バッファの先頭へのポインタではなく、バッファの末尾にポインタを戻しています。関数の最後の2行を見てください:

*newStr = '\0'; 
return newStr; 

明らかに、これはヌルchar、すなわち空の文字列へのポインタを返します。

出力バッファをステップ実行するために使用する一時ポインタを導入して問題を解決します。次に、ポインタを出力バッファの先頭に戻すことができます。

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; 
} 

上記のように、\nにも余分な文字を割り当てる必要があります。最後に、呼び出しコードはfunctionによって割り当てられたメモリを決して解放しません。

+0

、私は言っ結果= * pで警告を受ける「代入はキャストせずにポインタから整数を作る。」

..あなたが理解ホープ – captain

+0

いいえ、うまくいきます。ミスコピーが必要です。例:http://ideone.com/jQhMj –

0

私は二つのことを見てみます:

新しい文字列を割り当て、あなたが実際にその文字列に書いているどのように多くの文字を含むことを比較しているどのくらいのスペース
  • 返されたポインタが指す文字列のどこにありますか。
0

ポインタを最初の要素に戻す代わりに、char[]の最後の要素へのポインタをfunction()から戻します。

newStr++;を実行するたびに、後で返す実際のポインタが増えます。それを解決するために、あなたはこれらのいずれかを行うことができます

  1. newStrと同じで、それを高めるために初期化されるポインタnewStr、のコピーを作成 - それがあるとしてnewStrを残しています。
  2. インデックスを作成して[iとしてください]、それを増やして、割り当てられた配列にアクセスするにはnewStr[i]を使用してください。
0

コードをデバッグしました。ここでは、デバッグコードは次のとおりです。

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; 
} 

実際の問題は、あなたが最後までNewStrによってすでにインクリメントとしてあなたはfunction()からそれを返されたとき、それはバッファの末尾に指していたということでした。すなわち'\0'です。それが現れなかった理由です。今私は上記のコードでは、newStrの文字列の先頭にポイントする変数strを導入しました。

は、それはまだ動作しません平和...

関連する問題