初心者です。初めて投稿させて頂きます。上手く説明できるかどうかわかりませんが、と
りあえず聞いて下さい、お願いします。
strcmpのアルゴリズムを書かなくてはいけないのですが、一生懸命ネットでサーチや考え
たりしてますがわかりません。strcmpのコードがどんなものかわからないのですが、その
ものではなく、代用となるアルゴリズムなんです。ポインタなどはまだ習っておらず、こ
の問題はc stringを勉強してるところにありました。
コードを書いてみたものを抜粋すると、
while (str1[i] == str2[i])
i++;
if (str1[i] == str2[i])
result = 0;
else if (str1[i] > str2[i])
result = 1;
else
result = -1;
という感じに考えたのですが、試してみると、全然間違った答えが返ってきます。もう数
時間も考えててお手上げです。
どなたか、何かいいアイデアはございませんでしょうか?
>試してみると、全然間違った答えが返ってきます。
こういう質問をする場合は、どんな値を渡すとどんな答えが返ってくるのかを書くと喜
ばれます。
で、本題。
2つほど気づいた点を指摘してみると
・i は最初に 0 に初期化されていますか?
・文字列の終端チェックをすべきです
が挙げられます。
>while (str1[i] == str2[i])
一つ目は読んで字の如く、while 文の前に
i = 0;
を入れるだけです。
二つ目は、C の文字列というのは '\0' で終わるので、これ以降のメモリにアクセスす
ることは不正です。
現在の while 文では、str1 と str2 が同じ場合、この終端を越えて比較を続けてしま
います(ウチでは不正終了しました)。
そこで、str1[i] あるいは str2[i] が '\0' であった場合に while 文を抜けるコード
を書き足してください。
解説はしないけど そのまんまソース
int __cdecl strcmp (
const char * src,
const char * dst
)
{
int ret = 0 ;
while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)
++src, ++dst;
if ( ret < 0 )
ret = -1 ;
else if ( ret > 0 )
ret = 1 ;
return( ret );
}
こんなに早くレスを頂いて感激です。
シャノンさん:
実は、あんまり長々しく貼り付けるとスペースをとって悪いかなぁと余計な心配をしてし
まったので、i=0;は含めなかったんです。 あと、実はstr1[i] あるいは str2[i] が
'\0'も試した中のひとつにありました。ほんと、たくさんエラーが返ってくるものまで
もいろいろ試してみたので、どれも自信がなくって。ところで、これを上手く書けなかっ
たのか、例えばintという文字とintentionという文字を比べるとequalという答えが返っ
てきてしまうのです。
ちなみにwhile (str1[i] == str2[i]&& (str1[i]=='\0'|| str2[i]=='\0')) と書きまし
た。おかしいですか?
でも、ということは考え方自体ははずしてなかったのでしょうか? だったらうれしいで
す。気が軽くなりました。
woodさん:
コードありがとうございます。*はポインタなのですよね。そのうちならうので、保存し
ておいて理解できるかその時じっくり見てみます。貴重な情報感謝します!
while 文のカッコの中にはループを続ける条件を書く、というのはご存知ですよね?
>while (str1[i] == str2[i]&& (str1[i]=='\0'|| str2[i]=='\0'))
これだと、str1[i] == str2[i] はいいとしても、その後が
「str1[i] または str2[i] のどちらかが '\0' の場合にループを継続」になっ
てしまいます。
正解は逆で、「str1[i] または str2[i] のどちらかが '\0' の場合にループを終了」、
言い換えれば「str1[i] と str2[i] のどちらも '\0' でない場合にループを継続」
でなければなりませんから、答えは
while (str1[i] == str2[i]&& str1[i]!='\0'&& str2[i]!='\0')
になります。
あるいは、オリジナルに近い書き方をするなら
while (str1[i] == str2[i]&& !(str1[i]=='\0'|| str2[i]=='\0'))
でも構いません。
&& の後に ! が一文字入っていることに注目。
どちらの書き方でも OK なのは、いわゆる「ド・モルガンの法則」というヤツですね。
シャノンさん
再度、本当にありがとうございました。
シャノンさんの教えを試したら解決しました。説明されると「そういえば!」って納得す
るのですが、完全に理解してないものだから間違えてしまうみたいです。こんなのばっか
りです。もっともっと勉強しないと。シャノンさん、本当に助かりました。すごい嬉しい
です。また詰まってしまったときは質問させてください!