- ベストアンサー
strcmp()関数について教えてください
- strcmp()関数は、文字列を比較するための関数です
- この関数は、引数として与えられた2つの文字列を辞書順に比較し、その結果を返します
- もしstrcmp(a, b)が0を返す場合、aとbは同じ文字列とみなされ、それ以外の場合は異なる文字列とみなされます
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
strcmpとは、文字列1と文字列2の大小を比較します。文字列の長さの比較ではありりません。また、文字列と文字は違います。文字列は、必ず終端にNULL文字('\0'と書きます。数値の0の値をとります)が有る状態のことをいいます。文字列とは、"abc"などですが、'x'は1文字ですので、文字列ではありません。したがって、strcmp("abc",'x')は、そもそもコンパイルエラーとなり、実行できません。(文字列と文字列の比較しか出来ません) ここから、本題。 > 前の文字が一文字(h)で後ろ文字が複数(abc)、 > 前の文字が複数(hjk)で後ろの文字が一文字(p)、 > 両方が複数の文字列(lmnとstu) "h"と"abc"の比較と解釈します。'h'と"abc"の比較は、前述しましたようにコンパイルエラーになります。 "h"とは、1文字目がh,2文字目が\0の状態です。 同様に、"abc"は、1文字目がa,2文字目がb,3文字目がc,4文字目が\0の状態です。 strcmp("h","abc")は まず1文字目どうしを比較します。 hとaです。hのほうが大きいので+の値を返して終わりです。 "hjk"と"p"の比較は strcmp("hjk","p")です。 1文字目どうしを比較します。hとpでは、pのほうが大きいので-の値を返して終わりです。 strcmp("lmn","stu") 1文字目のlとsを比較します。sのほうが大きいので、-の値を返して終わりです。 以下、余談。 strcmp("abc","abx") 1文字目が同じで決着つかず。次の文字へ 2文字目が同じで決着つかず。次の文字へ 3文字目でxが大きいので-を返します。 strcmp("abc","abc") 1文字目が同じで決着つかず。次の文字へ 2文字目が同じで決着つかず。次の文字へ 3文字目同じで決着つかず。次の文字へ 次の文字がないので0を返す。(文字列が同じケース) strcmp("abc","abcd") 1文字目が同じで決着つかず。次の文字へ 2文字目が同じで決着つかず。次の文字へ 3文字目同じで決着つかず。次の文字へ 前の文字(左側)の文字は、次が'\0'なので、 値が0になります。dの方が大きいので-を返します。
その他の回答 (6)
- m-take0220
- ベストアンサー率60% (477/782)
> もう少し具体的に教えていただけないでしょうか。 > 全く意味が理解出来ません、宜しくお願いします。 これ以上具体的にと? あなたの目の前に英和辞典があるとします。電子的なものではなくて、紙に印刷された本です。 今、開いているページにはhが載っています。これからabcという単語の意味を調べたいとしたら、どちらにページをめくっていきますか? どちらにページをめくるかは、abcの1文字目であるaと、hを比較して決めませんか? abcが3文字であることは関係ないのではないですか? あなたはなぜか1文字同士だと辞書の順番で、そうでない場合は違う方法だと思い込んでいるようですが、何文字であっても辞書の順番です。文字列の長さで比較するなどとはどこにも書かれていません。 この辞書の順番というのをプログラム的に説明されたのが、No.1の回答です。
- asuncion
- ベストアンサー率33% (2127/6289)
国語辞典を引くときのことを想像してください。 「キーボード」という5文字の言葉と「マウス」という3文字の言葉では、 どちらが前に載っていますか? 「えんぴつ」という4文字の言葉と「シャープペンシル」という8文字の言葉では、 どちらが前に載っていますか? どちらが前に載っているかと、言葉の長さとに、関係がありますか?
- m-take0220
- ベストアンサー率60% (477/782)
> 前の文字が一文字(h)で後ろ文字が複数(abc) あなたがabcを辞書で調べるとき、たまたま開いたページに載っていたのがhだったら、そのページより前を調べますよね。abcが3文字だということが、辞書のhより前のページを調べるか、後のページを調べるかに影響しますか?
お礼
m-さん、回答有り難う御座います。 >あなたがabcを辞書で調べるとき、たまたま開いたページに載っていたのがhだったら、そのページより前を調べますよね。 >abcが3文字だということが、辞書のhより前のページを調べるか、後のページを調べるかに影響しますか? もう少し具体的に教えていただけないでしょうか。 全く意味が理解出来ません、宜しくお願いします。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> 文字列の長さは比較の対象ではないのでしょうか 僕の回答をもっぺんよく読め。
- asuncion
- ベストアンサー率33% (2127/6289)
文字列の長さを比べる関数はstrlenです。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
双方の0文字目を比較します。勝負がついたら(等しくなければ)比較終了。 勝負がつかなかったら1文字目を比較します。 それでも勝負がつかなかったら2文字目を比較します。 ...以下同文。 この処理の途中でどちらかがタネ切れ(比較すべき文字がなくなった)なら、短い方の負けです。 双方同時にタネ切れなら、最後の文字の比較結果となります。
お礼
epistemeさん、回答有り難う御座います。 >双方の0文字目を比較します。勝負がついたら(等しくなければ)比較終了。 # 比較するのは辞書に出てくる文字の順序を数字化したものだけが対象でしょうか。 文字列の長さは比較の対象ではないのでしょうか。 前の文字が一文字(h)で後ろ文字が複数(abc)、 前の文字が複数(hjk)で後ろの文字が一文字(p)、 両方が複数の文字列(lmnとstu) だったら一体どのように比較していくのでしょうか。 スミマセン、宜しくお願いします。
お礼
tatsu99さん、非常に分かりやすい説明ありがとうございました。 理解できました。 今後とも宜しくお願いします。