![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
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)の形にしたのかわかりません。
No.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()関数も含めて、自分で書いてしまうと思います。
No.2
- 回答日時:
>長さa分というのがよくわかりません。
変数aは、ここでは文字列s2の文字列長です。なぜなら「a = strlen(s2)」だから。
ゆえに、memcmpの第3引数の仕様により「s1とs2を長さa分だけメモリ比較する」になります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- Visual Basic(VBA) エクセルVBAで教えて頂きたいのですが? 2 2022/12/31 20:28
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- Java Java 南京錠 2 2023/02/04 11:46
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルでアルファベットか数...
-
VBAでの Replace関数で、ワイル...
-
文字列からタブコードを取り除...
-
EXCELで=より左の文字を一括で...
-
Excelで3E8を3.00E+8にしない方...
-
【Excel VBA】複数ある特定の文...
-
Excelで指数表現しないようにす...
-
エクセルで文字列をtxtファイル...
-
アクセスで特定の数字以外(複...
-
OnTime 使用時のプロシージャへ...
-
Left関数とRight関数を合わせた...
-
VBA2005 16進を2桁で表示したい。
-
同一セル内に関数と文字列を同...
-
エクセルで文字列の最大値を抽...
-
MS SQLServer のSQLで文字列の...
-
VBの「As String * 128」とは?
-
エクセルのLEFT関数をC言...
-
16進数を10進数に簡単に変換す...
-
(エクセル)複数のセルの数値...
-
vbsからバッチファイル実行時の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルでアルファベットか数...
-
EXCELで=より左の文字を一括で...
-
VBAでの Replace関数で、ワイル...
-
Excelで指数表現しないようにす...
-
文字列からタブコードを取り除...
-
Excelで3E8を3.00E+8にしない方...
-
エクセルで文字列をtxtファイル...
-
エクセルで文字列の最大値を抽...
-
VBA2005 16進を2桁で表示したい。
-
同一セル内に関数と文字列を同...
-
Left関数とRight関数を合わせた...
-
VBの「As String * 128」とは?
-
Msgboxの×が押されたとき
-
【Excel VBA】複数ある特定の文...
-
MS SQLServer のSQLで文字列の...
-
アクセスで特定の数字以外(複...
-
エクセルでセル内の文字列の最...
-
ORCLEでの小数の表示方法の変更...
-
変数内に入った文字列の結合 UWSC
-
エクセル 数値データを桁をそ...
おすすめ情報
aは(メモに書かれた)s1と入力されたs2がいた場合に返り値、
0,1,-1を出すためだけにあるのでしょうか?