プロが教える店舗&オフィスのセキュリティ対策術

 今日は、Cの初心者です、宜しくお願いします。

 a,bが一文字のとき、「if(strcmp(a,b)==0)」では、a,bの大小は辞書に出てくる順序を返すとありますが、
a="abcde",b="xyz"として「if(strcmp(a,b)==0)」とかくと、これは文字の長さを比較するのでしょうか。
 それとも先頭文字のについて、辞書に出てくる順序の大小を返すのでしょうか。

 本を読むと単に「比較する」とだけしか書いてないのですが、一体「文字」又は「文字列」の何を比較するのでしょう。
 「辞書に出てくる順序」なのでしょうか、それとも「長さ」なのでしょうか。
 一方が文字列(p="xyz")でもう一方が一文字(q)で「if(strcmp(p,q)==0)」のときは何を比較するのでしょうか。

 宜しくお願いします。

A 回答 (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の方が大きいので-を返します。
    • good
    • 0
この回答へのお礼

tatsu99さん、非常に分かりやすい説明ありがとうございました。
理解できました。
今後とも宜しくお願いします。

お礼日時:2009/10/11 10:54

> もう少し具体的に教えていただけないでしょうか。


> 全く意味が理解出来ません、宜しくお願いします。

これ以上具体的にと?
あなたの目の前に英和辞典があるとします。電子的なものではなくて、紙に印刷された本です。
今、開いているページにはhが載っています。これからabcという単語の意味を調べたいとしたら、どちらにページをめくっていきますか?
どちらにページをめくるかは、abcの1文字目であるaと、hを比較して決めませんか? abcが3文字であることは関係ないのではないですか?

あなたはなぜか1文字同士だと辞書の順番で、そうでない場合は違う方法だと思い込んでいるようですが、何文字であっても辞書の順番です。文字列の長さで比較するなどとはどこにも書かれていません。
この辞書の順番というのをプログラム的に説明されたのが、No.1の回答です。
    • good
    • 0

国語辞典を引くときのことを想像してください。



「キーボード」という5文字の言葉と「マウス」という3文字の言葉では、
どちらが前に載っていますか?

「えんぴつ」という4文字の言葉と「シャープペンシル」という8文字の言葉では、
どちらが前に載っていますか?

どちらが前に載っているかと、言葉の長さとに、関係がありますか?
    • good
    • 0

> 前の文字が一文字(h)で後ろ文字が複数(abc)



あなたがabcを辞書で調べるとき、たまたま開いたページに載っていたのがhだったら、そのページより前を調べますよね。abcが3文字だということが、辞書のhより前のページを調べるか、後のページを調べるかに影響しますか?
    • good
    • 0
この回答へのお礼

m-さん、回答有り難う御座います。

>あなたがabcを辞書で調べるとき、たまたま開いたページに載っていたのがhだったら、そのページより前を調べますよね。
>abcが3文字だということが、辞書のhより前のページを調べるか、後のページを調べるかに影響しますか?

もう少し具体的に教えていただけないでしょうか。
全く意味が理解出来ません、宜しくお願いします。

お礼日時:2009/10/10 22:38

> 文字列の長さは比較の対象ではないのでしょうか



僕の回答をもっぺんよく読め。
    • good
    • 0

文字列の長さを比べる関数はstrlenです。

    • good
    • 0

双方の0文字目を比較します。

勝負がついたら(等しくなければ)比較終了。
勝負がつかなかったら1文字目を比較します。
それでも勝負がつかなかったら2文字目を比較します。
...以下同文。
この処理の途中でどちらかがタネ切れ(比較すべき文字がなくなった)なら、短い方の負けです。
双方同時にタネ切れなら、最後の文字の比較結果となります。
    • good
    • 0
この回答へのお礼

 epistemeさん、回答有り難う御座います。

 >双方の0文字目を比較します。勝負がついたら(等しくなければ)比較終了。
# 比較するのは辞書に出てくる文字の順序を数字化したものだけが対象でしょうか。
 文字列の長さは比較の対象ではないのでしょうか。

  前の文字が一文字(h)で後ろ文字が複数(abc)、
  前の文字が複数(hjk)で後ろの文字が一文字(p)、
  両方が複数の文字列(lmnとstu)

だったら一体どのように比較していくのでしょうか。

 スミマセン、宜しくお願いします。

お礼日時:2009/10/10 17:24

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