0

Cで2つの文字列を追加しようとしています.

これが私のコードです。s3 を返すと、何も出力されません。それでも、s1 または s2 を返すと、正しく返されます。

また、キーボードでEnterキーを2回押すと、印刷されます"L¬(."

C++ では、このような問題は一度もありませんでした。

誰かが問題があるかどうかを確認できますか?

#include <stdio.h>
#include <string.h>

/*
    Return the result of appending the characters in s2 to s1.
    Assumption: enough space has been allocated for s1 to store the extra
    characters.
*/
char* append (char s1[ ], char s2[ ]) {
    int s1len = strlen (s1);
    int s2len = strlen (s2);
    int s3len=strlen(s1)+strlen(s2);
   // printf("%d", s1len);
    char s3[s3len];
    int k;
    int j;
    for(j=0; j<s1len; j++) {
        s3[j]=s1[j];
    }

    for (k=0; k<s2len; k++) {
        s3[k+s1len] = s2[k];

    }

    return s3;
}

int main ( ) {
    char str1[10];
    char str2[10];
    while (1) {
        printf ("str1 = ");
        if (!gets (str1)) {
            return 0;
        };
        printf ("str2 = ");
        if (!gets (str2)) {
            return 0;
        };
        printf ("The result of appending str2 to str1 is %s.\n", 
            append (str1, str2));
    }
    return 0;
}
4

3 に答える 3

3

問題は、s3は のローカル変数であるappendため、 のメモリs3が に割り当てられappend、ポインタを返すかどうかに関係なく、スコープから外れたとき (関数が終了したとき) に解放されることです。

あなたがすべきことはs3char *またはchar[]関数へのパラメータとして渡すことです。

このように:(変更appendは十分に簡単なはずです)

// yes the +1 to be able to null-terminate the string is needed,
//   or just make it much bigger
char s3[strlen(str1) + strlen(str2) + 1];
append(str1, str2, s3);
printf("The output is %s\n", s3);

また、ogzd が提案したように、 in0の最後の文字としてa を追加することを忘れないでください (文字列を null で終了します)。s3append

代替案:

  • (C++) Return std::string(メモリがコピーされるため、少し遅くなります)

  • malloc(C/C++) またはnew(C++) を実行しappendて、 にメモリを割り当てますs3freeメモリはそれぞれ'd または'dでなければならないため、これは危険な行為deleteです。

ではmalloc、文字通り変更する必要があるのはs3、関数内の の定義だけです。

char *s3 = malloc(s3len+1);

通常、次のように言います。

type *s3 = malloc(sizeof(type)*len);

でもchar1バイトなのでsizeof(char) = 1.

于 2013-02-11T21:03:49.257 に答える
1

ローカル変数 s3 を返す代わりに

それの割り当てられたコピーを返します:

return strdup(s3);

処理が完了したら、返されたメモリを必ず解放してください。

また、文字列を 0 で終了するようにしてください。これは、文字列と配列を区別する唯一のものであるため、C では不可欠です。文字列引数を取る関数は、末尾の 0 が文字シーケンスにあると想定します。

于 2013-02-11T21:16:06.280 に答える
1

\0の最後の文字をお忘れなくs3

char s3[s3len+1];
......

s3[s3len] = 0; // \0 character
于 2013-02-11T21:01:02.277 に答える