電子書籍の厳選無料作品が豊富!

配列str1に"Hello"、str2に"World!"を代入し、strcat関数を使わずに文字列を連結させ、出力するプログラムなのですが、
#include <stdio.h>
#include <string.h>
int main(void)
{
char str1[100],str2[100];
int i=0,j=0;
printf("str1>");
scanf("%s",str1);
j=strlen(str1);
printf("str2>");
scanf("%s",str2);
while(str2[i] != '\0'){
str1[i+j]=str2[i];
i++;
}
printf("%s\n",str1);
return 0;
}
ここの意味を教えていただけないでしょうか。
while(str2[i] != '\0'){
str1[i+j]=str2[i];
i++;
お願いします

A 回答 (4件)

>このプログラムがちゃんと動くのは、


>char str1[100] で 100文字分 '¥0' で初期化されるからです。

ちゃんと動かないにー票。自動変数配列の初期化は
初期化値式を書かないと
されないはず。

char str1[100]={0};

勿論、初期化に頼らず、null文字まできちんとコピーする
べきだと思います。
    • good
    • 0

str1 文字型配列に格納されている文字の最後 ('¥0' の位置 - j) から str2 に格納されているをコピーする。


ただ、str2 側に格納されている'¥0' もコピーすべきでしょうね。
このプログラムがちゃんと動くのは、char str1[100] で 100文字分 '¥0' で初期化されるからです。
私なら while 文は
do {
str1[i+j]=str2[i];
} while(str2[i++] != '\0');
って書くかな。
    • good
    • 0

意味としては「strcat関数を使わずに文字列を連結」に当たる部分ですね。



この部分を strcat を使えば、
strcat (str1, str2);
の 1行で終わってしまいます。

文字列は '\0' (NULL文字)で終わる文字コードの集合です。
この場合 str1 には 'Hello\0' (説明上 \0 を記述しています) str2 には 'World!\0' が代入されているはずなので、
j=strlen(str1);
で、str1 の(\0までの)文字数を調べ、

j の値は str1 の \0 の位置を示していることになるので、
while(str2[i] != '\0'){
str1[i+j]=str2[i];
i++;
}
は、str2 の\0が見つかるまで、str1 と str2 の配列位置を1文字ずつずらして str2 の i の位置から str1 の j + i の位置へ文字をコピーしています。

要するに、str1 の末尾の位置から str2 をコピー(連結)することですね。
    • good
    • 0

文字列を連結する.

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!