1

次のコードは、最初の文字列のみを連結し、2 番目の文字列を無視します。私が収集したものから、Null で終了する文字列と関係があります。私は C が初めてなので、これは私にとって新しい概念です。誰かが以下のコードを機能させるのを手伝ってくれませんか? これは、これを理解するのに非常に役立ちます。

void concatTest();

int main()
{
    concatTest();

    system("PAUSE");
    return 0;
}

void concatTest()
{
    char string1[20], string2[20], string3[40];
    char *ptr1, *ptr2, *ptr3;
    ptr1 = &string1[0];
    ptr2 = &string2[0];
    ptr3 = &string3[0];
    int i;

    printf("You need to enter 2 strings.. each of which is no more than 20 chars in length: \n");

    printf("Enter string #1: \n");
    scanf("%s", string1);

    printf("Enter string #2: \n");
    scanf("%s", string2);

    int len1 = strlen(string1);
    int len2 = strlen(string2);

    for (i = 0; i < len1; i++)
    {
        ptr3[i] = ptr1[i];
    }
    for (i = len1; i < len1 + len2; i++)
    {
        ptr3[i] = ptr2[i];
    }

    printf("%s\n", string3);
}
4

3 に答える 3

2

からまでの範囲をptr2[i]使用してインデックスを作成しています。この値はおそらく配列の範囲外になります (最初に入力した文字列がたまたま空でない限り)。ilen1len1 + len2string2

次のように2番目のループを書くかもしれません:

for (i = 0; i < len2; i++) {
    ptr3[len1 + i] = ptr2[i];
}
于 2012-07-15T23:59:30.707 に答える
2

私の答えにはコードはありませんが、うまくいけば便利な説明です。

C の各文字列は で終了し\0ます。

2 つの文字列を連結する場合は、最初の文字列の最後の文字 ( ) を2 番目の文字列の最初の文字で上書きする必要があります。それ以外の場合、「連結された」文字列の長さに関係なく、文字列関数が a に遭遇するとすぐに、文字列の終わりに達したと見なされます。\0\0

そしてもちろん、ジョイント ストリング用に十分なスペースが割り当てられていることを確認する必要があります。

于 2012-07-15T23:55:45.927 に答える
1

ptr2 の最初の文字から開始する必要があります。

ptr3[i] = ptr2[i-len1];

私が収集したものから、それはヌルで終了する文字列と関係があります。

はい、そうです。文字列はオフセット 0 から始まります。最初の文字列の長さに基づいてランダムなポイントから開始していました。

于 2012-07-16T00:05:50.417 に答える