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