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;
}
No.2ベストアンサー
- 回答日時:
> この関数をプログラムに組み込んだところうまく動作しませんでした。
どんな風に「うまく動作し」なかったのでしょうか?
それがわからなければ、明らかな間違いでも無いかぎり、答えようがありません。
特に
> ちなみに標準関数と全く同じものにしたいわけではなく、それを自分なりに考えて作りたいという趣旨ですので、ご理解ください。
とあるので、このプログラムと標準関数との違いが、間違いなのか仕様通りなのか判断できません。
例えば、
> char *MyStrcmp(char *str1, char *str2)
プログラムを解読すると
str1とstr2、それぞれの文字列の長さを比較。
→長さ等しい場合は (char *)NULL, 異なる場合は、長い方の文字列へのポインタを返す
と、strcmpとはまったく別の関数になっています。(strcmpは文字列の内容も比較し、結果を 負の整数,0,正の整数 (いずれもint型)で返します)
あと、明確な間違いというわけではないですが。
> while(*p1 != NULL){
大抵の処理系では NULL == '\0' == 0 として使えるけど、ヌルポインタとヌル文字はわけて考えた方がいいです。
関数ごとのご指摘ありがとうございます。
もっと細かい点に注意したいと思います。
うまく動作しない点については、まだ自分でもどこがうまくいっていないか理解していない部分が多々ありますので、今回の指摘を元にもう少し自分で考えたいと思います。
ありがとうございました。
No.4
- 回答日時:
まあ「自分で考える」ならそれでいいけど....
#1 の
「なにが」「どう」「期待しない動作」をしましたか?
というのは, 「自分でもどこがうまくいっていないか理解していない」としても挙げることができるはずです. そもそも「うまく動作しない」というのは「実際に動作させてみた」ということですよね? そのときに
・どのような入力を与えたのか
・その入力に対し自分はどんな動作をすると思ったのか
・実際にはどのような動作をしたのか
は当然わかるはずです. これらを書いてほしい, ってこと. こういうのが書いてあると親切な質問だなぁって思ったりする.
しかし, 「ひとつひとつを見たときに動作を確認したところうまく出来た」ってのはどんな入力に対してどういう結果を見てそう思ったんだろう....
No.3
- 回答日時:
書くべきところは既に書かれているのでさらなる突っ込みだけ:
・MyMemcpy の引数がなぜか char * (MyMemcmp の引数は void * なのに).
・const char * から char * にキャストしている: 代入なんかしないにもかかわらずなぜこっち向きにキャストするのか.
・そのくせ MyStrstr の引数は const char * じゃなくて char *.
No.1
- 回答日時:
つっこみどころいっぱいですねぇ。
・memcmp()が0x00を含む場合に比較できない。
・strcmp()、memcmp()ともに「文字列の長さ」しか比較していない。
・'\0'とNULLがごっちゃになっている。
・NULLと0がごっちゃになっている。
まぁ、それはおいといて…
>うまく動作しませんでした。
「なにが」「どう」「期待しない動作」をしましたか?
# *p1++;って表記はちょっと身構えますな…。ポインタ進めたいだけならp1++;かと。
コマンドラインから引数を貰い、その内容によってテキストを変換するプログラムを作成しました。その中でmemcpy等の関数を使用したのですがそれを自作関数で代用したいと思って作成しました。
>「なにが」「どう」「期待しない動作」をしましたか?
まだ自分でもどこがうまくいっていないか理解していない部分が多々ありますので、今回の指摘を元にもう少し自分で考えたいと思います。
ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
charでの計算?
-
干支のプログラム
-
c言語の文字列の逆順のプログラ...
-
分割した単語の頻出頻度を表示...
-
C言語のfor文です。 繰り返しの...
-
コンパイルエラー invalid ope...
-
配列をnビットシフトする
-
C言語です
-
構造体の各メンバにfor文からア...
-
C言語エラーについて
-
charからLPTSTRへの変換方法
-
文字を16進変換
-
「ポインタのポインタ」を使っ...
-
'const char *' 型は 'char *' ...
-
double型の値をchar配列に変換...
-
宣言する関数の形が決まってい...
-
【C言語】文字型と整数型の違い
-
決まった文字列幅でのスクロール
-
間接操作のレベルとは
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
charからLPTSTRへの変換方法
-
charでの計算?
-
配列をnビットシフトする
-
'const char *' 型は 'char *' ...
-
型変換
-
テキストデータをそのままバイ...
-
文字列から空白を取り除きたい...
-
CStringをwchar_tに変換したい
-
絶対パスからのファイル名の切...
-
fgetsなどのときのstdinのバッ...
-
ネットワークにつながっている...
-
str系関数を使わずに二つの文字...
-
3桁区切(コンマ)記号をつけ...
-
atoi( ) の反対をやりたい
-
double型の値をchar配列に変換...
-
C言語のfor文です。 繰り返しの...
-
switch文で文字を比較すること...
-
ファイル名である文字列からbas...
-
c++ 文字列を入力して、一文字...
-
strncpyと_tcsncpy_sのヌルの扱...
おすすめ情報