Apple IDログイン機能メンテナンスのお知らせ

いまc言語の標準ライブラリ文字列を勉強しているのですがいまいちわかりません。
strcmpとmemcopの違いとどうやって文字列を比較しているかがいまいちわかりません。
等しい場合はわかるのですが大きい時と小さい時ってどうやって比較してるんですか?
アスキーコードで比較してるんですか?

A 回答 (5件)

コンピュータの中ではあらゆるものが「数値」で表現されるので, もちろん「文字」も対応する「文字コード」で表現される. ただし, C の規格上「どの文字コードを使うか」は規定されておらず, 「ASCII」に限定しているわけではない. 規格上文字コードに対する条件は


・数字 (に対応するコード) は連続する
・ラテンアルファベットはその順に大きくなる
・全て非負
なので, UTF-32 や古式ゆかしい EBCDIC でもかまわない.

なお機能についてコメントしておくと, strcmp(s1, s2) や memcmp(s1, s2, n) は各バイトを unsigned char と解釈し, 先頭バイトからみていって最初に異なるバイトがあったときに
・s1 の方が s2 より大きければ正の値
・s1 の方が s2 より小さければ負の値
を返す. 最後まで同じだったら 0 が返る. いわゆる「辞書式順序」ってやつだ.

実はぎりぎりのケースを考えると案外実装は難しい.
    • good
    • 0

> アスキーコードで比較してるんですか?



C言語の仕様上は規定してない筈です。
要は「文字コード」をどうすっか、ってのはC言語の仕様自体とは別の問題となる。「C言語の仕様範疇外の話」になるんじゃないのかな。
なお、事実上、C言語には「文字列」も「文字」もなく、全部数値だけ、なんで、配列に置いた数値を先頭から比較して、「大小」が生じた時点で打ち切ってそこでの差を返す、って実装になってるんじゃないかな。

例: omeko omanko

両方とも先頭から見ていくとoは同じ(差ナシ)、mも同じ、と来て、3文字目で差がある、と。eとaの文字コード(つまり事実上数値だ)を見て、その差を返してオシマイ、と。
実装上はそういう実装になってるんじゃないのかね、多分。

詳しい話は、JISでC99の仕様書が公開されてるんで読んでみたらいいと思う。

JIS X 3010:2003 プログラム言語C
https://kikakurui.com/x3/X3010-2003-01.html

日本ではいまだに、公式には「C言語」と言うのはISO(国際標準化機構)で定義されてる通称「C99」になっているんで、上の仕様書が「日本でのC言語」です。
(ISOからは今年「C23」が発表される、って話なんだけど、JISがそれに追随するのかどうかはちと分からんです)
    • good
    • 0

>アスキーコードで比較してるんですか?


アスキーコードでかかれた文字列ならそうです
別の文字コードで書かれた文字列なら、その別の文字コードでの比較になりますね

【戻り値】
s1 > s2 で正の値、s1 < s2 で負の値、s1 = s2で 0 を返す。この大小関係は一般に文字コード順による。
    • good
    • 0

>アスキーコードで比較してるんですか?


イメージとしては、それでOKです。
厳密には1バイトのunsigned char の値で比較します。
異なる場合は、その差(第1引数の値-第2引数の値)を返します。
    • good
    • 0

若いころ使ってたけどもう20年ぐらいコード書いてないのであやふやな記憶から回答します。



>strcmpとmemcopの違い
これはstrcmpとmemcmpの違いということかな?
\0までを文字列として比較するか、指定された長さのメモリ領域の内容を比較するかの違いですね。
strcmpよりstrncmpがmemcmpに引数などが似ていますね。

strcmpの比較方法は2つの文字列の先頭から1文字ずつ比べて、同じなら次の文字、、、とヌルまで比較を続けてます。違いが発生したら両方のデータの引き算の結果を返した(ような気がする)のでプラスだったりマイナスだったりします、この結果の値にあまり利用価値はなくて、要は0以外が返されるということです。
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています