
strstr()関数が、どのように実装されてるか知りたかったため、strstr.cの中身を見てみたのですが、
分らない処理がありました。
char * __cdecl strstr (const char * str1, const char * str2)
{
char *cp = (char *) str1;
char *s1, *s2;
if ( !*str2 )
return((char *)str1);
while (*cp)
{
s1 = cp;
s2 = (char *) str2;
while ( *s1 && *s2 && !(*s1-*s2) )
s1++, s2++;
if (!*s2)
return(cp);
cp++;
}
return(NULL);
}
while文のネストの部分で、*s1 && *s2 && !(*s1-*s2)とありますが、
(*s1 && *s2) または !(*s1-*s2) のどちらか一方のみではまずいのでしょうか?
解説、アドバイスの程よろしくお願い致します。
No.3ベストアンサー
- 回答日時:
>(*s1 && *s2) または !(*s1-*s2) のどちらか一方のみではまずいのでしょうか?
while ( *s1 && !(*s1-*s2) )
で十分です。
*s1、*s2ともナル文字以外の時は、!(*s1-*s2)の結果、等しい間のみループします。
*s1がナル文字以外、*s2がナル文字の時は、!(*s1-*s2)が0になるのでループを抜けます。
*s1がナル文字、*s2がナル文字以外の時と、*s1、*s2ともナル文字の時は*s1が'\0'ですのでループを抜けます。
お返事が遅くなってしまいありがとうございました。
大変分かりやすい場合分けをして頂いたお陰で理解できました。
ありがとうございました。
標準関数の実装内容をより簡単に(シンプルに?)できる場合もあるんですね。勉強になりました。
No.2
- 回答日時:
*s1 && *s2
これで、両方の文字がまだあるかを検査しています。
どちらかが文字列の終了になると、この条件は成立しなくなります。
!(*s1-*s2)
これで、文字の一致を見ています。
*s1と*s2が同じ文字の場合は0(偽)になりますので、それの否定(真)ですので一致している間ループ処理が行われます。
一致しないと0では無くなります(真)ので、それの否定(偽)ですのでループ脱出となります。
ということで、どちらの条件も必要不可欠ということになります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
For文の終了値を関数にしても問...
-
do-while文が禁止される理由
-
エクセルVBAで Do While (1)って?
-
最早開始時間と最遅完了時刻を...
-
C言語 エラーの原因がわからな...
-
信頼区間の1.96や1.65ってどこ...
-
Enterキーを押されたら次の処理...
-
プログラムでの数字につく”f”の...
-
「Aに対するBの割合」と「Aに対...
-
C++のfor文について
-
変数とパラメータとは違うもの...
-
C言語のプログラミングですが、
-
LNK2019:未解決の外部シンボル ...
-
main.c:7:43: warning: implici...
-
2÷3などの余りについて
-
数学 一次関数 関数 y=-3/4x+k(...
-
Aの値からBの値を除するとは??
-
CPU温度・負荷等を調べるには
-
long型の定数の末尾にLを付ける...
-
#define _CRT_SECURE_NO_WARNIN...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ループを途中で抜けたいのですが。
-
do-while文が禁止される理由
-
PAD図の書き方
-
入力した文字列から母音だけを...
-
入力した数値を倍々するプログラム
-
if文の中にfor文なのか、for文...
-
C言語forループが完結した場合...
-
アルゴリズムです!四つの数字...
-
break文でループを一気に抜ける...
-
エクセルVBAで Do While (1)って?
-
モンテカルロシミュレーション...
-
このC#プログラムの1〜11を埋め...
-
プログラミングC言語についての...
-
C++ DirectX カーソルの移動処...
-
HEWのバグ?
-
ゲームオーバーのプログラム
-
プログラムで関数は使わない方...
-
Delphiで・・・
-
他言語で言うcontinue文
-
Excel VBAで年度をまたぐ期間の...
おすすめ情報