- 締切済み
自作strcat
関数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は一文字少なく表示されてしまいます。自分ではどこをどう直せばいいかわかりません。よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- kenji_aki
- ベストアンサー率50% (29/58)
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 文字列定数がどのようにメモリに配置されているのか 環境によって違います。 今回は、たまたま問題なく実行できただけです。
- aris-wiz
- ベストアンサー率38% (96/252)
> char *s1 = "abc"; > char *s2 = "vwxyz"; 上記二つは s1 と s2 に「どのような値」が入ってくるのか、 s1とs2が何を指すのかきちんと理解してください。 文字列「定数」がどのようなものなのか考えれば、 何故、これでダメなのか考えればすぐに分かります。
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
>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文字少なく表示されるかが判ります。 そして、何が悪かったのか、どう直せば良いかも判る筈です。
- Tacosan
- ベストアンサー率23% (3656/15482)
よかったね~, 死ななくって. my_strcat でどこに書き込んでますか?
- koko_u_u
- ベストアンサー率18% (216/1139)
>これを実行したところ、s1はちゃんとs1にs2を連結した形で表示されました。 たまたまです。よく実行できましたね。 strcat() のマニュアルをまずは読みましょう。