- ベストアンサー
自作の関数に問題があるかな
- 自作の関数をプログラムに組み込んだところうまく動作しない
- memcpy, memcmp, strcmp, strlen, strcat, strcpy, strstr, strchrの関数を自作
- 標準関数と同じ動作ではなく、自分なりに作りたい
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
> この関数をプログラムに組み込んだところうまく動作しませんでした。 どんな風に「うまく動作し」なかったのでしょうか? それがわからなければ、明らかな間違いでも無いかぎり、答えようがありません。 特に > ちなみに標準関数と全く同じものにしたいわけではなく、それを自分なりに考えて作りたいという趣旨ですので、ご理解ください。 とあるので、このプログラムと標準関数との違いが、間違いなのか仕様通りなのか判断できません。 例えば、 > char *MyStrcmp(char *str1, char *str2) プログラムを解読すると str1とstr2、それぞれの文字列の長さを比較。 →長さ等しい場合は (char *)NULL, 異なる場合は、長い方の文字列へのポインタを返す と、strcmpとはまったく別の関数になっています。(strcmpは文字列の内容も比較し、結果を 負の整数,0,正の整数 (いずれもint型)で返します) あと、明確な間違いというわけではないですが。 > while(*p1 != NULL){ 大抵の処理系では NULL == '\0' == 0 として使えるけど、ヌルポインタとヌル文字はわけて考えた方がいいです。
その他の回答 (3)
- Tacosan
- ベストアンサー率23% (3656/15482)
まあ「自分で考える」ならそれでいいけど.... #1 の 「なにが」「どう」「期待しない動作」をしましたか? というのは, 「自分でもどこがうまくいっていないか理解していない」としても挙げることができるはずです. そもそも「うまく動作しない」というのは「実際に動作させてみた」ということですよね? そのときに ・どのような入力を与えたのか ・その入力に対し自分はどんな動作をすると思ったのか ・実際にはどのような動作をしたのか は当然わかるはずです. これらを書いてほしい, ってこと. こういうのが書いてあると親切な質問だなぁって思ったりする. しかし, 「ひとつひとつを見たときに動作を確認したところうまく出来た」ってのはどんな入力に対してどういう結果を見てそう思ったんだろう....
お礼
回答ありがとうございます。 次回からはその様に質問できるように気をつけたいと思います。
- Tacosan
- ベストアンサー率23% (3656/15482)
書くべきところは既に書かれているのでさらなる突っ込みだけ: ・MyMemcpy の引数がなぜか char * (MyMemcmp の引数は void * なのに). ・const char * から char * にキャストしている: 代入なんかしないにもかかわらずなぜこっち向きにキャストするのか. ・そのくせ MyStrstr の引数は const char * じゃなくて char *.
お礼
ご指摘ありがとうございます。 ご指摘頂いた点をを改善していきたいと思います。 ありがとうございました。
- Wr5
- ベストアンサー率53% (2173/4061)
つっこみどころいっぱいですねぇ。 ・memcmp()が0x00を含む場合に比較できない。 ・strcmp()、memcmp()ともに「文字列の長さ」しか比較していない。 ・'\0'とNULLがごっちゃになっている。 ・NULLと0がごっちゃになっている。 まぁ、それはおいといて… >うまく動作しませんでした。 「なにが」「どう」「期待しない動作」をしましたか? # *p1++;って表記はちょっと身構えますな…。ポインタ進めたいだけならp1++;かと。
お礼
コマンドラインから引数を貰い、その内容によってテキストを変換するプログラムを作成しました。その中でmemcpy等の関数を使用したのですがそれを自作関数で代用したいと思って作成しました。 >「なにが」「どう」「期待しない動作」をしましたか? まだ自分でもどこがうまくいっていないか理解していない部分が多々ありますので、今回の指摘を元にもう少し自分で考えたいと思います。 ありがとうございます。
お礼
関数ごとのご指摘ありがとうございます。 もっと細かい点に注意したいと思います。 うまく動作しない点については、まだ自分でもどこがうまくいっていないか理解していない部分が多々ありますので、今回の指摘を元にもう少し自分で考えたいと思います。 ありがとうございました。