strcmp関数に関して

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら

strcmp関数に関して

#1

投稿記事 by » 16年前

こんばんは、いつもお世話になっています。
現在、C言語の初歩的なテキストを見ながら進めています。
WindowsのVistaを使っています。

strcmp関数についてなんですけれども

char str[/url] = "ABC";
char str1[/url] = "ABC";
char str2[/url] = "ABD";

strcmp(str, str1); ----①
strcmp(str, str2); ----②

①と②の実行結果では0と-1になりました(処理系に値は異なります)。
strcmp関数は文字列と文字列を比較して、それぞれ、正の値、負の値、0を戻り値として返すのですよね。

文字列と文字列の大小の比較と何を基準に比較するのでしょうか?
5と3だったら、5のほうが大きいと分かりますが、"ABC"と"ABD"の文字列の大小の比較なんてできるのでしょうか?

よろしくお願いします。

たかぎ

Re:strcmp関数に関して

#2

投稿記事 by たかぎ » 16年前

> 文字列と文字列の大小の比較と何を基準に比較するのでしょうか?

文字列中の各文字をunsigned char型の数値とみなして単純比較します。
前から順に比較していき、値が異なった時点で、その文字の大小関係を比較していると考えてかまいません。

Re:strcmp関数に関して

#3

投稿記事 by » 16年前

回答ありがとうございます。

unsigned char型の数値とは何でしょうか。
insignedだから符号なしということですよね。符号なしのchar型の数値…?

kazuoni

Re:strcmp関数に関して

#4

投稿記事 by kazuoni » 16年前

検索すればいろいろ出てくるかと思いますが、参考までに。

http://www.geocities.jp/ky_webid/c/024.html

>文字列と文字列の大小
各文字列の先頭から一文字ずつ(文字コードに沿って)比較している
のですが、返ってくる値は処理系に依存します。

なので(自分はですが)strcmpは二つの文字列が
等しいかどうかの比較の時に使います。(二つが等しければ0が返ってくる)
ABC>ABDのように文字列の比較をする時は、自作関数を実装してもよい気がします。

自分なりの解釈でした^^;
下手に書かないほうがいいですね。。
大変失礼しました。。

たかぎ

Re:strcmp関数に関して

#5

投稿記事 by たかぎ » 16年前

> unsigned char型の数値とは何でしょうか。
> insignedだから符号なしということですよね。符号なしのchar型の数値…?

strcmpに渡す引数はconst char*ですが、char型が符号付きか符号無しかは処理系定義です。
ですので、strcmpの内部では、unsigned charであるとみなして比較を行います。

hoge

Re:strcmp関数に関して

#6

投稿記事 by hoge » 16年前

> 文字列中の各文字をunsigned char型の数値とみなして単純比較します。

C99では、これは正しいですが、C89には、明確な規定がありません。
JISでは独自に補足して規定したようですが。
実際、signedで比較を行う処理系があったようです。
http://blade.nagaokaut.ac.jp/cgi-bin/sc ... y-dev/4298

C99に対応していない処理系を使っている場合、一応確認しておいたほうがよいと思う。

toyo

Re:strcmp関数に関して

#7

投稿記事 by toyo » 16年前

>>昴さん
他人のソースを見るのも勉強になりますよ
これはunsignedで比較
int
strcmp(const char *s1, const char *s2)
{
        while (*s1 == *s2++)
                if (*s1++ == 0)
                        return (0);
        return (*(unsigned char *)s1 - *(unsigned char *)--s2);
}
これは片方の文字列が終わったときだけunsignedで
int
strcmp (const char *s1, const char *s2)
{
  while (*s1 != 0 && *s1 == *s2)
    s1++, s2++;

  if (*s1 == 0 || *s2 == 0)
    return (unsigned char) *s1 - (unsigned char) *s2;
  return *s1 - *s2;
}
これは戻り値が1, 0, -1のみ
int
strcmp(char *s1, char *s2)
{
        unsigned c1, c2;

        for(;;) {
                c1 = *s1++;
                c2 = *s2++;
                if(c1 != c2) {
                        if(c1 > c2)
                                return 1;
                        return -1;
                }
                if(c1 == 0)
                        return 0;
        }
}

初級者

Re:strcmp関数に関して

#8

投稿記事 by 初級者 » 16年前

char型は、int型などよりせまい範囲の整数を扱う型であると
理解するのがよいかもしれません。

hss12

Re:strcmp関数に関して

#9

投稿記事 by hss12 » 16年前

例えば
Aの文字コードが65で、Bの文字コードが66ですので
Bの文字のほうが大きいと分かります。

strcmp関数が文字コードで比較しているかは
これこそ処理系によって異なります、なのかもしれませんが。

ちなみに文字コードはunsigned char型の数値です。(違う場合もあり)

Re:strcmp関数に関して

#10

投稿記事 by » 16年前

皆様、回答ありがとうございました。
よく、分かりました。

閉鎖

“C言語何でも質問掲示板” へ戻る