ページ 1 / 1
strcmp関数に関して
Posted: 2009年3月24日(火) 01:22
by 昴
こんばんは、いつもお世話になっています。
現在、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関数に関して
Posted: 2009年3月24日(火) 01:36
by たかぎ
> 文字列と文字列の大小の比較と何を基準に比較するのでしょうか?
文字列中の各文字をunsigned char型の数値とみなして単純比較します。
前から順に比較していき、値が異なった時点で、その文字の大小関係を比較していると考えてかまいません。
Re:strcmp関数に関して
Posted: 2009年3月24日(火) 01:49
by 昴
回答ありがとうございます。
unsigned char型の数値とは何でしょうか。
insignedだから符号なしということですよね。符号なしのchar型の数値…?
Re:strcmp関数に関して
Posted: 2009年3月24日(火) 01:50
by kazuoni
検索すればいろいろ出てくるかと思いますが、参考までに。
http://www.geocities.jp/ky_webid/c/024.html
>文字列と文字列の大小
各文字列の先頭から一文字ずつ(文字コードに沿って)比較している
のですが、返ってくる値は処理系に依存します。
なので(自分はですが)strcmpは二つの文字列が
等しいかどうかの比較の時に使います。(二つが等しければ0が返ってくる)
ABC>ABDのように文字列の比較をする時は、自作関数を実装してもよい気がします。
自分なりの解釈でした^^;
下手に書かないほうがいいですね。。
大変失礼しました。。
Re:strcmp関数に関して
Posted: 2009年3月24日(火) 02:00
by たかぎ
> unsigned char型の数値とは何でしょうか。
> insignedだから符号なしということですよね。符号なしのchar型の数値…?
strcmpに渡す引数はconst char*ですが、char型が符号付きか符号無しかは処理系定義です。
ですので、strcmpの内部では、unsigned charであるとみなして比較を行います。
Re:strcmp関数に関して
Posted: 2009年3月24日(火) 02:36
by hoge
> 文字列中の各文字をunsigned char型の数値とみなして単純比較します。
C99では、これは正しいですが、C89には、明確な規定がありません。
JISでは独自に補足して規定したようですが。
実際、signedで比較を行う処理系があったようです。
http://blade.nagaokaut.ac.jp/cgi-bin/sc ... y-dev/4298
C99に対応していない処理系を使っている場合、一応確認しておいたほうがよいと思う。
Re:strcmp関数に関して
Posted: 2009年3月24日(火) 08:18
by toyo
>>昴さん
他人のソースを見るのも勉強になりますよ
これは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関数に関して
Posted: 2009年3月24日(火) 10:00
by 初級者
char型は、int型などよりせまい範囲の整数を扱う型であると
理解するのがよいかもしれません。
Re:strcmp関数に関して
Posted: 2009年3月24日(火) 20:16
by hss12
例えば
Aの文字コードが65で、Bの文字コードが66ですので
Bの文字のほうが大きいと分かります。
strcmp関数が文字コードで比較しているかは
これこそ処理系によって異なります、なのかもしれませんが。
ちなみに文字コードはunsigned char型の数値です。(違う場合もあり)
Re:strcmp関数に関して
Posted: 2009年3月29日(日) 09:20
by 昴
皆様、回答ありがとうございました。
よく、分かりました。