プロが教える店舗&オフィスのセキュリティ対策術

関数strcatを自分で作ってみました。

#include<stdio.h>

char *my_strcat(char *s1, char *s2){
int i = 0;
int n = 0;
while(s1[i] != '\0'){
i++;
}
while(s2[n] != '\0'){
s1[i] = s2[n];
i++;
n++;
}
s1[i] = '\0';
return s1;
}

int main(){
char *s1 = "abc";
char *s2 = "vwxyz";
my_strcat(s1, s2);
printf("s1:%s s2:%s\n", s1, s2);
return 0;
}

これを実行したところ、s1はちゃんとs1にs2を連結した形で表示されました。しかし、s2は一文字少なく表示されてしまいます。自分ではどこをどう直せばいいかわかりません。よろしくお願いします。

A 回答 (5件)

s1→[0]


s2→[4]

[0]番地
|0|1|2|3 |4...
|a|b|c|\0|...
[4]番地
|4|5|6|7|8|9 |A...
|v|w|x|y|z|\0|...

my_strcat(s1, s2);
|0|1|2|3|4|5|6|7|8 |9 |A...
|a|b|c|v|w|x|y|z|\0|\0|...
|↑s1 |↑s2

文字列定数がどのようにメモリに配置されているのか
環境によって違います。
今回は、たまたま問題なく実行できただけです。
    • good
    • 0

> char *s1 = "abc";


> char *s2 = "vwxyz";
上記二つは s1 と s2 に「どのような値」が入ってくるのか、
s1とs2が何を指すのかきちんと理解してください。

文字列「定数」がどのようなものなのか考えれば、
何故、これでダメなのか考えればすぐに分かります。
    • good
    • 0

>char *s1 = "abc";


>char *s2 = "vwxyz";
>my_strcat(s1, s2);
問1.この「s1」の後ろに文字列を連結した時、s1の後ろはどうなりますか?以下のA~Cから正しいと思う物を1つ選びなさい(25点)

選択肢
A.何も起きない
B.文字列"vwxyz"が書き込まれる
C.何かが書き込まれるが、何が書き込まれるか判らない

問2.また、連結前のs1の後ろには、何がありますか?以下のA~Cから正しいと思う物を1つ選びなさい(25点)

選択肢
A.文字列s2を書き込むだけの充分な開き領域がある
B.たぶん文字列s2がある
C.そこに何があるか判らない

問3.文字列"abc"と"vwxyz"が、下図の図1ようにメモリに配置されていた場合、関数my_strcatを呼び出した後の、メモリ内の状態はどうなりますか?以下のA~Cから正しいと思う物を1つ選びなさい(25点)

図1
'a'←ポインタs1が指すアドレス
'b'←ポインタs1が指すアドレス+1
'c'←ポインタs1が指すアドレス+2
0←ポインタs1が指すアドレス+3
'v'←ポインタs1が指すアドレス+4、ポインタs2が指すアドレス
'w'←ポインタs1が指すアドレス+5、ポインタs2が指すアドレス+1
'x'←ポインタs1が指すアドレス+6、ポインタs2が指すアドレス+2
'y'←ポインタs1が指すアドレス+7、ポインタs2が指すアドレス+3
'z'←ポインタs1が指すアドレス+8、ポインタs2が指すアドレス+4
0←ポインタs1が指すアドレス+9、ポインタs2が指すアドレス+5

選択肢
A.
'a'←ポインタs1が指すアドレス
'b'←ポインタs1が指すアドレス+1
'c'
'v'
'w'
'x'
'y'
'z'
0
'v'←ポインタs2が指すアドレス
'w'
'x'
'y'
'z'
0

B.
'a'←ポインタs1が指すアドレス
'b'←ポインタs1が指すアドレス+1
'c'
'v'←ポインタs2が指すアドレス
'w'←ポインタs2が指すアドレス+1
'x'
'y'
'z'
0

C.
'a'←ポインタs1が指すアドレス
'b'←ポインタs1が指すアドレス+1
'c'
'v'
'w'←ポインタs2が指すアドレス
'x'←ポインタs2が指すアドレス+1
'y'
'z'
0
0

>printf("s1:%s s2:%s\n", s1, s2);
問4.問3の条件で関数my_strcatを呼び出した結果、上記のprintf関数で表示される文字列はどうなりますか?以下のA~Cから正しいと思う物を1つ選びなさい(25点)

選択肢
A.s1:abc s2:vwxyz
B.s1:abcvwxyz s2:vwxyz
C.s1:abcvwxyz s2:wxyz

すべて、正解は「C」です。

これで100点を取れれば、s2がどうして1文字少なく表示されるかが判ります。

そして、何が悪かったのか、どう直せば良いかも判る筈です。
    • good
    • 0

よかったね~, 死ななくって.


my_strcat でどこに書き込んでますか?
    • good
    • 0

>これを実行したところ、s1はちゃんとs1にs2を連結した形で表示されました。



たまたまです。よく実行できましたね。
strcat() のマニュアルをまずは読みましょう。
    • good
    • 0

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