- ベストアンサー
自作関数の要約
- 自作関数の要約文1。
- 自作関数の要約文2。
- 自作関数の要約文3。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
前回も書いたのですが、 NULLと'\0'は使いわけるようにした方がよいです。 NULLはポインタがどこも指していない状態を表わすヌルポインタ '\0'は文字列の終端記号として使われるヌル文字です。 何度も > *p1 != NULL というような式が出てきますが、これだと 「ポインタ p1がヌルポインタではない」と書くつもりで、間違えて * を付けたのか、 「ポインタp1が指す実体がNULL→p1は『ポインタへのポインタ』」と言う意味で、p1の宣言に*が足りないのか、 「ポインタp1が指す実体が0」と言う意味で、NULLではなく '\0'と書くべきところなのか わかりません。(これくらいの量なら、プログラムを解析して3番目の意味で使っている、とわかりますが) 標準関数に準拠するということなので。 ・MyStrstr str1="ZabYXabcWV" ; str2="abc" ; の時、結果はどうなるでしょう?おそらく、期待したものが返らないはずです。 *p1==*p2となった2文字目のaで最初のwhileを抜けて、次のwhileに入ります。'Y' != 'c' となる 3回目にループを抜けます。*p2は'\0'ではないので、NULLがリターンされます。 本当なら、次から3文字目のbから続けて探しなおさなければいけません。 文字列検索は以外と奥深い分野です。 ・MyStrcat ・MyStrcpy 動作は問題ないけど > if(*p2 == NULL){ 直前で *p2=='\0'になるまでwhileループを回しているので、ここは必ず *p2=='\0'になっているので、この判定は不要のはず。 *p1 = *p2; だけか、*p2=='\0'にきまっているので *p1= '\0' ; でよい。 ・MyStrcmp 間違いではないけれど > if(*p1 < *p2)return -1; > if(*p1 > *p2)return 1; *p1 == *p2 のelseなので、絶対どちらかのはず。よって、 下はelseでよい。 また、 return (*p1 < *p2)?1:-1; と三項演算子をつかってもいい。 標準関数strcmpは「正,0,負」としか既定していないので、 *p1<*p2なら *p1 - *p2 < 0, *p1>*p2なら *p1-*p2 > 0 を使って return (*p1 - *p2) ; とする方法もある。
その他の回答 (1)
- Tacosan
- ベストアンサー率23% (3656/15482)
質問を, もっと丁寧に書こうとは思わなかった? たとえば ・「前回」といって誰もが「ああ, あれね」とわかると思う? ・「仕様は出来るだけ標準関数に近いものを自作したい」といってるけど, 「標準関数に近い」ということは「標準関数と違っていてもいい」ということも意味する. つまり, 「どの関数がどの標準関数に『近い』仕様を持っているのか」, そしてそのうえで「どのように標準関数と違っていてもいいのか」を明確にしなければ正しいかどうかの厳密な判定は不可能. とりあえず「'\0' と NULL を混同するな」って言われてなかった?
お礼
とても丁寧な説明ありがとうございます。 ご指摘された点を改善してうまく動作するように作り直せました。
お礼
とても丁寧な説明ありがとうございます。 ご指摘された点を改善してうまく動作するように作り直せました。 今後は質問をもっと丁寧にできるように改善していきたいと思います。