プロが教えるわが家の防犯対策術!

課題で
strstr()と同じ働きをするmy_strstr()を実装しなさいという課題がでています。

strstr()は
char *strstr(const char *s1, const char *s2)
という形で、
文字列s2が文字列s1の中に含まれていれば、文字列1の文字列2が含まれている先頭のアドレス(ポインタ)を返す関数です。(すいません、説明が下手で)

例えば、 strstr(Japanese, pan)は Japanese にpan が 含まれるのでpan 以降の文字列を返します→panese

***********************

質問ですが、
strstrの実装は完成して、正常に動くのですが
警告がでてきます。

str1= Japanese str2 = pan
とすると、
私のプログラムでは、次のようなプロセスで動きます。

一文字ずつ調べる

str1のJと str2の pを比較
       J != p → str1++; //str1の次の文字へ

str1のaと str2の pを比較
       a != p, str1++; //str1の次の文字へ

str1のpと str2の pを比較
       p == p, rec = str1 // str1のアドレスを記録
        str1++; str2++; //次の文字へ

str1のaと str2の aを比較
       a == a, str1++; str2++; //次の文字へ

str1のnと str2の nを比較
       n == n, str1++; str2++; //次の文字へ

str1のeと str2 nullを比較
   *str2 = null //search 終了。
return rec;


とこんな感じです。
このプロセスの3行目の
rec = str1;

つまり、関数の戻り値のために記録したstr1のところで、
「問題のあるポインタ変換」
という警告がでます。

これは s1がconstだからでしょうか?
どのようにしたらこの警告が消えるでしょうか?

どなたかよろしければアドバイスをいただけませんか。
お願いします。

A 回答 (4件)

★キャストをすれば良い。


・下のようになります。

サンプル1:
char *my_strstr( const char *str1, const char *str2 )
{
 char *rec;
 
 /* 処理 */
 rec = (char*)str1;
 /* 処理 */
 return( rec );
}

サンプル2:
char *my_strstr( const char *str1, const char *str2 )
{
 const char *rec;
 
 /* 処理 */
 rec = str1;
 /* 処理 */
 return( (char*)rec );
}

解説:
・代入時にキャストするサンプル1と return 文でキャストするサンプル2のどちらかの方法を
 取って下さい。私はサンプル2の方法をよく利用します。
・以上。参考に。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
キャストをすることによって簡単に解決しました。
勉強になりました。

お礼日時:2007/04/17 14:24

> これは s1がconstだからでしょうか?


> どのようにしたらこの警告が消えるでしょうか?

そうです。既に回答が出ているように、キャストをすれば警告は消えます。あるいは、処理系によってはコンパイルオプションや#pragma指令を工夫することでも警告を消せるでしょう。

ところで提案なのですが、この警告は消さない方がよいのではないでしょうか?strstr関数は、第一引数にchar*型をわたしたときに返却値をキャスト無しでchar*に代入できるように、このような仕様になっています。しかし、素性も分からないconst char*をchar*に変換するのは、必ずしも望ましいことではありません。警告が出てもエラーになることは規格上ありませんし(警告をエラーとするようなコンパイルオプションを使ったり、非標準処理系の場合は別)、動作も保証されますから、この警告は備忘録として放置しておくのも有効な選択ではないかと思います。

ちなみに、C++ではこのような問題を解消するため、

char* strstr(char*, const char*);



const char* strstr(const char*, const char*);

が多重定義されます。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
自分の知識不足で、
「このconst char*が素性のわからないもの」
なのかすらわからないです。
ここのconst char*をchar* に変換することは危険なことなのですか?

そこら辺の疑問は先生に相談することにします。
とにかく、回答ありがとうございました。
専門家さんの回答は、勉強になります。

お礼日時:2007/04/17 14:32

>これは s1がconstだからでしょうか?


多分その通りだと思います。
recもconstにしたらいいのでは。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
recをconstにしたり、
s1を型キャストでchar * にしたりすることで
解決しました。

お礼日時:2007/04/17 14:22

ロジックの説明をしてくださることは、それはそれで


けっこうなことなのですが、実装したコードを
見せてくださると手っ取り早いのではないかと思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
コード自体が長かったのと、
自分の問題がポインタ変換の部分だけであることから
上記の記述で十分かなと判断しました。
わかりにくい記述で申し訳ありません。
ご指摘ありがとうございます。
もっとわかりやすい質問を心がけます。

お礼日時:2007/04/17 14:21

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