一回も披露したことのない豆知識

char my_str2(const char* s1, const char* s2)//ここで入力した文字列と用意された文字列を引数として扱う。
{
const size_t a = strlen(s2);
//無限ループする。
for (;;) {
//関数memcmpの返り値が0の時は一致した時なので、==0とする。
if (memcmp(s1, s2, a) == 0)

return 1;//入力した文字列にい指定された文字列が入っていた場合は1を返すように設定した。
//入力した文字列が最後の文字まで到達した場合は一致する文字列がないということなので0を返すようにした。
else if (*s1 == '\0')

return 0;//入っていなかった
//文字列が一致した場合でも一致する文字列がない場合でも入力した文字列の一文字分の文字コードのバイト数?が繰り上がるようにした。
else

++s1;

}


}
において、なぜconst size_t a = strlen(s2);
for (;;) {
if (memcmp(s1, s2, a) == 0)
を加える必要があるのですか?
なんのために、s2のバイト数をもとめaに代入して、if (memcmp(s1, s2, a) == 0)の形にしたのかわかりません。

質問者からの補足コメント

  • aは(メモに書かれた)s1と入力されたs2がいた場合に返り値、
    0,1,-1を出すためだけにあるのでしょうか?

      補足日時:2021/02/01 17:22

A 回答 (3件)

memcmp(s1,s2,n)という関数は「メモリー領域 s1 とs2 の最初の n バイトを比較する」とありますので、ご質問者様ご提示の関数char my_str2(const char* s1, constchar* s2)は『文字列s1にもう一方の文字列s2が含まれているかどうか。

』を判定するためのものです。

解りやすくするために次のような例を考えたらよいのではないでしょうか。

1.2つの文字列を次のように宣言します。

char Worda [] = "abcdefghi",
Wordb [] = "def";

2.次のようにして関数をコールします。

char Ans = my_str2 ( Worda, Wordb);

Wordbの文字列数は3文字ですから、関数内の変数"a"には"3"が代入されていることになります。

3.forループの中で、2つの文字列は次のように比較されます。

Loop1
s1: abcdefghi
____||| 不一致。
s2: def

Loop2
s1: bcdefghi
____||| 不一致。
s2: def

Loop3
s1: cdefghi
____||| 不一致。
s2: def

Loop4
s1: defghi
____||| 一致。
s2: def

ということで「WordbはWordaに含まれている」と判定されることになります。つまりご指摘の「for (;;) {...if (memcmp(s1, s2, a) == 0)...」を加えることは必須だということになります。
ところで...

char Worda [] = "abcdefghi",
Wordb [] = "1234567890def";

と宣言した時、memcmp()関数はどの様に動くのでしょうかね。調べる手間を考えると私なら、memcmp()関数も含めて、自分で書いてしまうと思います。
    • good
    • 2
この回答へのお礼

非常にわかりやすい回答ありがとうございます。

お礼日時:2021/02/04 08:56

>長さa分というのがよくわかりません。



変数aは、ここでは文字列s2の文字列長です。なぜなら「a = strlen(s2)」だから。
ゆえに、memcmpの第3引数の仕様により「s1とs2を長さa分だけメモリ比較する」になります。
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2021/02/04 08:56

今見てるs1とs2を長さa分だけメモリ比較するためです。


それをもって「入力した文字列に指定された文字列が入っていた場合」を判定してます。

とくに難しいところはないかと。
    • good
    • 2
この回答へのお礼

理解力が低くてすいません。
もう少しわかりやすく教えていただけないでしょうか?長さa分というのがよくわかりません。

お礼日時:2021/02/01 12:58

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