アプリ版:「スタンプのみでお礼する」機能のリリースについて

memcpy,memcmp,strcmp,strlen,strcat,strcpy,strstr,strchr
以上の関数を自作しました。
ひとつひとつを見たときに動作を確認したところうまく出来たのですが、この関数をプログラムに組み込んだところうまく動作しませんでした。
どこか間違っているところがあったら指摘して頂きたいと思います<m(__)m>
ちなみに標準関数と全く同じものにしたいわけではなく、それを自分なりに考えて作りたいという趣旨ですので、ご理解ください。


char *MyMemcpy(char *str1, char *str2, size_t n)
{

char *p1 = str1;
char *p2 = str2;


while(n--){
*p1 = *p2;
p1++;
p2++;
}

return str1;
}
void *MyMemcmp(void *str1, void *str2)
{
char *p1 = (char*)str1;
char *p2 = (char*)str2;
int n = 0, k = 0;

while( *p1 != '\0'){
*p1++;
n++;
}

while( *p2 != '\0'){
*p2++;
k++;
}

if(n > k){
return str1;
}else if(n == k){
return 0;
}else if(n < k){
return str2;
}

}
char *MyStrcmp(char *str1, char *str2)
{
char *p1 = str1;
char *p2 = str2;
int n = 0, k = 0;

while( *p1 != '\0'){
*p1++;
n++;
}

while( *p2 != '\0'){
*p2++;
k++;
}

if(n > k){
return str1;
}else if(n == k){
return 0;
}else if(n < k){
return str2;
}

}
size_t MyStrlen(const char *str1)
{
char *p1 = (char*)str1;
size_t len = 0;

while(*p1 != NULL){
*p1++;
len++;
}

return len;
}
char *MyStrcat(char *str1, const char *str2)
{
char *p1 = str1;
char *p2 = (char*)str2;

while(*p1 != NULL){
*p1++;
}
while(*p2 != NULL){
*p1 = *p2;
*p1++;
*p2++;
}

return str1;
}
char *MyStrcpy(char *str1, char *str2)
{
char *p1 = str1;
char *p2 = str2;

while( *p2 != NULL){
*p1 = *p2;
*p1++;
*p2++;
}
*p1 = '\0';

return str1;
}
char *MyStrstr(char *str1, char *str2)
{
char *p1 = str1;
char *p2 = str2;

while(*p1 != *p2)
{
if(*p1 == '\0'){
return 0;
}
*p1++;
}
return p1;

}
char *MyStrchr(const char *str1, char str2)
{
char *p1 = (char*)str1;

while(*p1 != str2)
{
if(*p1 == '\0'){
return 0;
}
*p1++;
}
return p1;
}

A 回答 (4件)

> この関数をプログラムに組み込んだところうまく動作しませんでした。



どんな風に「うまく動作し」なかったのでしょうか?
それがわからなければ、明らかな間違いでも無いかぎり、答えようがありません。

特に
> ちなみに標準関数と全く同じものにしたいわけではなく、それを自分なりに考えて作りたいという趣旨ですので、ご理解ください。
とあるので、このプログラムと標準関数との違いが、間違いなのか仕様通りなのか判断できません。

例えば、
> char *MyStrcmp(char *str1, char *str2)
プログラムを解読すると

str1とstr2、それぞれの文字列の長さを比較。
→長さ等しい場合は (char *)NULL, 異なる場合は、長い方の文字列へのポインタを返す

と、strcmpとはまったく別の関数になっています。(strcmpは文字列の内容も比較し、結果を 負の整数,0,正の整数 (いずれもint型)で返します)


あと、明確な間違いというわけではないですが。
> while(*p1 != NULL){

大抵の処理系では NULL == '\0' == 0 として使えるけど、ヌルポインタとヌル文字はわけて考えた方がいいです。
    • good
    • 0
この回答へのお礼

関数ごとのご指摘ありがとうございます。
もっと細かい点に注意したいと思います。

うまく動作しない点については、まだ自分でもどこがうまくいっていないか理解していない部分が多々ありますので、今回の指摘を元にもう少し自分で考えたいと思います。
ありがとうございました。

お礼日時:2010/10/13 10:43

まあ「自分で考える」ならそれでいいけど....



#1 の
「なにが」「どう」「期待しない動作」をしましたか?
というのは, 「自分でもどこがうまくいっていないか理解していない」としても挙げることができるはずです. そもそも「うまく動作しない」というのは「実際に動作させてみた」ということですよね? そのときに
・どのような入力を与えたのか
・その入力に対し自分はどんな動作をすると思ったのか
・実際にはどのような動作をしたのか
は当然わかるはずです. これらを書いてほしい, ってこと. こういうのが書いてあると親切な質問だなぁって思ったりする.

しかし, 「ひとつひとつを見たときに動作を確認したところうまく出来た」ってのはどんな入力に対してどういう結果を見てそう思ったんだろう....
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
次回からはその様に質問できるように気をつけたいと思います。

お礼日時:2010/10/13 14:32

書くべきところは既に書かれているのでさらなる突っ込みだけ:


・MyMemcpy の引数がなぜか char * (MyMemcmp の引数は void * なのに).
・const char * から char * にキャストしている: 代入なんかしないにもかかわらずなぜこっち向きにキャストするのか.
・そのくせ MyStrstr の引数は const char * じゃなくて char *.
    • good
    • 0
この回答へのお礼

ご指摘ありがとうございます。
ご指摘頂いた点をを改善していきたいと思います。

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

お礼日時:2010/10/13 10:45

つっこみどころいっぱいですねぇ。



・memcmp()が0x00を含む場合に比較できない。
・strcmp()、memcmp()ともに「文字列の長さ」しか比較していない。
・'\0'とNULLがごっちゃになっている。
・NULLと0がごっちゃになっている。

まぁ、それはおいといて…
>うまく動作しませんでした。
「なにが」「どう」「期待しない動作」をしましたか?

# *p1++;って表記はちょっと身構えますな…。ポインタ進めたいだけならp1++;かと。
    • good
    • 0
この回答へのお礼

コマンドラインから引数を貰い、その内容によってテキストを変換するプログラムを作成しました。その中でmemcpy等の関数を使用したのですがそれを自作関数で代用したいと思って作成しました。

>「なにが」「どう」「期待しない動作」をしましたか?
まだ自分でもどこがうまくいっていないか理解していない部分が多々ありますので、今回の指摘を元にもう少し自分で考えたいと思います。
ありがとうございます。

お礼日時:2010/10/13 10:28

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