2

配列と文字列について学び始めたばかりで、2 つの文字列の入力を結合し、それらの長さを見つけた後、それらの値を別の文字列 に入れたいと思いましたstringAstringBstringC

組み込み関数なしで解決したい。

コードを書いてみましたが、 の長さstringBと の内容でエラーが発生しますstringC。これが私のコードです:

#include <stdio.h>
int main()
{
    char stringA[100];
    char stringB[100];
    char stringC[100];
    int lengthA=0;
    int lengthB=0;
    int i,j;

    printf("Enter a string A, terminate with a tilde.\n");
    scanf("%[^~]",stringA);
    while (stringA[lengthA] != '\0') 
        lengthA++;
    printf("The length is %d\n",lengthA+1);
    printf("Enter a string B, terminate with a !.\n");
    scanf("%[^!]",stringB);
    lengthB=0;
    while (stringB[lengthB] != '\0') 
        lengthB++;
    printf("The length is %d\n",lengthB+1);
    for(i=0;i<lengthA;i++)
        stringC[i]=stringA[i];
    for(i=lengthA;i<lengthA+lengthB;i++)
        stringC[i]=stringB[i];
    printf("%s",stringC);
    return 0;
}

あなたの助けに感謝します!

4

7 に答える 7

3

このループまではすべて問題ないようです。

for(i=lengthA;i<lengthA+lengthB;i++)
    stringC[i]=stringB[i];

ここで、 へのインデックスについて考える必要がありますstringB

また、NUL ターミネータについても忘れないでください。

editstringB : また、 を読んでいるとき、チルダと改行がまだ入力バッファにあることを忘れないでください。

于 2013-03-19T16:05:38.727 に答える
0

あなたは0インチから数えて、lengthA'\ 0'まですべての文字をインクリメントするので、lengthAは文字列の実際の長さです。長さA+1は必要ありません

stringCの最後にヌル文字を追加すると役立つでしょうか?

于 2013-03-19T16:07:20.500 に答える
0

このループでは、示されているようにlengthAforのオフセットを削除する必要がありますStringB

for(i=lengthA;i<lengthA+lengthB;i++)
    stringC[i]=stringB[(i - lengthA)];

NULLそして、ループの後にターミネータを追加します。

stringC[i] = '\0';
于 2013-03-19T16:08:03.597 に答える
0

stringB2 番目のループのインデックスが問題です。この時点でインデックスiが であることを思い出してください。lengthA変数を使用するのを忘れたのかもしれませんj;-)

for(i=lengthA, j = 0; i < lengthA+lengthB; i++, j++)
    stringC[i] = stringB[j];

stringC[i + 1] = '\0';

ヒントとして:あなたは必要ありませんj

for(i=lengthA; i < lengthA+lengthB; i++)
    stringC[i] = stringB[i - lengthA];

stringC[i + 1] = '\0';
于 2013-03-19T16:29:31.880 に答える
0

次の質問では、上記のコードでクリアされていない入力バッファについて説明しています。 Cで入力バッファをクリアするには? デバッガーを使用して、2 番目の scanf ステートメントの後の stringB の内容を確認してください。

于 2013-03-19T16:36:41.540 に答える
0

最初の文字列をインポートした後、チルダと改行を残しています。一定数の文字をクリアするので、一定回数呼び出すだけgetchar()でもかまいませんが、もっとエレガントな方法があるかもしれません。

を設定しているループでは、不適切stringCにインデックスを作成しています。stringB

stringCこの特定のコードが壊れるとは思いませんが、null terminate を確認してください。それは良い習慣です。

最後に、文字列の長さに余分な +1 を出力しています。これは必要ありません (長さの一部として ~ と ! を数えようとしている場合を除きます)。

于 2013-03-19T16:18:08.857 に答える
0

ジェイコブは的を得ている。

したがって、既存のコードを修正するには:

char stringC[200];

また、stringB のインデックスが間違っています。これはうまくいくはずです:

stringC[i]=stringB[i-lengthA];
于 2013-03-19T16:27:32.413 に答える