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

お世話になります。

Wikiペディアに掲載されていたstrcatの実装例(http://ja.wikipedia.org/wiki/Strcat#.E5.AE.9F.E8 …)をそのまま使って、
mystrcatを作ってみましたが、結果が空白になってしまいます。


[ソース]
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *mystrcat(char *s1, const char *s2)
{
char *p = s1;
while(*s1++);
while(*s1++ = *s2++);
return p;
}

void main(){
char *dst;
char *p;;
char *src1 = "Hello";
char *src2 = "World";
dst = malloc(strlen(src1)+strlen(src2)+1);
printf("%s\n",mystrcat(dst,src1));
printf("%s\n",mystrcat(dst,src2));
free(dst);
}

[実行結果]
空白2行


[期待していた動作]
Hello
HelloWorld


何が間違っているのか教えていただけると助かります。

標準のstrcatを使うとHelloとHelloWorldが表示されます。

よろしくお願いします。

A 回答 (5件)

>ところでmallocの間違いを指摘されていますが、


>どのように問題となるのでしょうか。
>心当たりがあるといえば、\0がないので、
>ゴミを表示するのではないか、と懸念されますが、

その前にたぶん吹っ飛びます。
確保した領域に'\0'がないと、
while(*s1) s1++;
で見つかるまでポインタをインクリメントし続けます。
バッファオーバーランって聞いたことありませんかね?

で、はみ出した場所に書き込もうとして破壊します。
# OSが止めてくれるかそのまま動作してさらに悲惨な状況になるか……。


>memsetでdstを'\0'で埋めれば良いということでしょうか。

それでもいいですし、確保した最初の場所だけに0x00を入れる。でもOKでしょう。
# 私ならmemset()でクリアする。(というかcalloc()使う)

この回答への補足

なるほどです。

callocも試してみます。

補足日時:2014/06/16 13:40
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2014/06/16 13:40

あ, 確かに>#3.



malloc では 0クリアしません>#2. calloc はするけど.

あと, たぶん未定義動作のはずだから「strcat()でも同様に失敗するハズ」ともいえないのがつらい.
    • good
    • 0

while(*s1++);



この行が間違い。

それ以前に、malloc() で確保したメモリ領域には、何が入っているかわからないので、それも問題だけど。

たとえば、上の行を

while(*s1) s1++;

とするだけで、とりあえず、動く。
どのように動きが違うのかを考えて見えるといいと思う。

この回答への補足

while(*s1++ = *s2++);

も間違いで、

while(*s2) *s1++ = *s2++;

が正しいということで理解し修正した結果

期待したとおりの結果となりました。

ところでmallocの間違いを指摘されていますが、
どのように問題となるのでしょうか。

心当たりがあるといえば、\0がないので、
ゴミを表示するのではないか、と懸念されますが、

memsetでdstを'\0'で埋めれば良いということでしょうか。

ついでに教えていただけるとありがたいです。

補足日時:2014/06/16 13:23
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2014/06/16 13:23

malloc()で確保したメモリの内容って0x00保証されていいましたっけ??


まぁ、この場合strcat()でも同様に失敗するハズですけど。
    • good
    • 0

strcat を使うのが間違っている.

    • good
    • 0

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