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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- Visual Basic(VBA) エクセルVBAで教えて頂きたいのですが? 2 2022/12/31 20:28
- 工学 電気回路の2端子対回路 (1)スイッチS1のみが開いているときの電流I1を求めよ。 (2)スイッチS 4 2023/05/29 16:40
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- 数学 数学の質問です。 kを正の実数とする。 点Pは△ABCの内部にあり、 kAP+5BP+3CP = 0 2 2023/07/03 21:24
- 工学 回路の勉強をしています。添付の説明で一点理解できないため教えてください。スイッチS1を閉じて定常状態 1 2022/10/24 15:58
- Visual Basic(VBA) 該当セルに行替えを含むデータを命令文に入れて、2行に表示したい。 5 2023/07/20 11:51
- 統計学 t値の計算方法 1 2022/11/29 18:37
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
break文でループを一気に抜ける...
-
do-while文が禁止される理由
-
繰り返し文の利点について
-
入力した文字列から母音だけを...
-
for文while文の無限ループの違...
-
ループの特定入力終了
-
C言語forループが完結した場合...
-
if文を使わずに奇数・偶数を判断
-
階層型ニューラルネットに準ニ...
-
アルゴリズムです!四つの数字...
-
C言語のfor文です。 繰り返しの...
-
2÷3などの余りについて
-
信頼区間の1.96や1.65ってどこ...
-
Enterキーを押されたら次の処理...
-
*をユーザーが入力した数字の数...
-
fgetsなどのときのstdinのバッ...
-
C言語で%を使わない余りの出し方
-
C言語
-
プログラムでの数字につく”f”の...
-
マイナスからプラスへ転じた時...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
break文でループを一気に抜ける...
-
do-while文が禁止される理由
-
ループを途中で抜けたいのですが。
-
入力した数値を倍々するプログラム
-
入力した文字列から母音だけを...
-
if文の中にfor文なのか、for文...
-
C言語forループが完結した場合...
-
エクセルでC言語のfor文と同じ...
-
Excel VBAで年度をまたぐ期間の...
-
For文の終了値を関数にしても問...
-
エクセルVBAで Do While (1)って?
-
C言語、whileループを抜け出す...
-
PAD図の書き方
-
Cプログラムが終了しない
-
PIC のプログラムについて ど...
-
他言語で言うcontinue文
-
C言語のプログラムみてください...
-
ループの特定入力終了
-
COBOLのEVALUATE文
-
for文while文の無限ループの違...
おすすめ情報