C言語関係掲示板

過去ログ

No.77. 辞書式順序での比較


こんにちわ。質問があります。
2つの文字列A=a1,a2,a3…ap, B=b1,b2,b3…bqを比較して
A=Bなら0、A>Bなら1、A<Bなら-1返すプログラムを作ろうと考えています。
いくつか不明な点があるのですが、とりあえず、「ある文字とある文字の大小比較をどう行なうか」がわかりません。例えば、GとHならG<H、HとTならH<T、のような比較をさせたいです。
ヒントをいただきたくよろしくお願い申し上げます。

PS:最終的には、辞書的比較をしたいです。例えば、combineとcompileならcompileが大、actとactionならactionが大、という感じで返させたいです。
今回は前者の判断のための基礎を伺いたく書き込みしました。


strcmp を使う……というのは禁止でしょうか、やっぱり。

 詳しい話は文字コードの部分を読んでもらうと分かると思いますが、文字 A, B, …… には、それぞれ文字コードが割り当てられており、殆どの文字コードでは A, B, ……, Z は小さい順になっています。
 これを上手く使えばかけるはず。

 ヒント:s, t が char* 型だとして、*s - *t は?

 ちなみに、答えは C のバイブルの 129 ページに載ってるですよ。


レスありがとうございます。

> strcmp を使う……というのは禁止でしょうか、やっぱり。

現時点では方法は問いません。いろいろなやり方を知っておきたいという気持ちがあります。

> ヒント:s, t が char* 型だとして、*s - *t は?

-1ですか?(全然違いますか…?)

> ちなみに、答えは C のバイブルの 129 ページに載ってるですよ。

Cのバイブルとは何でしょう…。このHPのなかにあるのですか…?

全体的にもう少しヒントをいただきたいです。

未熟者ですみません。
勘違いがありましたらすみません。 m(--)m


>> strcmp を使う……というのは禁止でしょうか、やっぱり。

 おそらくこの関数を使うのが最も近道です。
 strcmp は、string.h で int strcmp(const char *cs, const char *ct) と定義されており、これは辞書式配列で cs < ct であれば負を、cs == ct であれば 0 を、cs > ct であれば正を返します。但し、大文字、小文字は区別され、大文字は小文字より後に、例えば A は、z より後になります。

>> ヒント:s, t が char* 型だとして、*s - *t は?
>-1ですか?(全然違いますか…?)

 違います……。'b' - 'a' は? 'd' - 'a' は?ということを、ACSII CODE 表とにらめっこして考えたり、実際に
printf("%d", 'b' - 'a');

 等としてみてください。

>Cのバイブルとは何でしょう…。このHPのなかにあるのですか…?

 すいません。C のバイブルと言えば、一般にカーニハン&リッチーの、プログラミング言語 C という本のことを指します。邦訳が共立から出ているのでそれを見てもらうのがよろしいかと。


strcmpについては、ここが詳しいです。

http://www.geocities.co.jp/SiliconValley-Bay/8490/c_basic/cb_010.html

>Cのバイブルとは何でしょう…。このHPのなかにあるのですか…?

カーニハン&リッチー著の「プログラミング言語C」共立出版ですね。

>全体的にもう少しヒントをいただきたいです。

ここの問3は文字列の比較処理をしています。
ただし、等しいか否かだけですが。あと、ここはまだbreak文を
扱っていないところなので、flgを使っています。
不一致の文字が出現したら、break文でループを抜け、友葉さんのヒントの
>> ヒント:s, t が char* 型だとして、*s - *t は?
を使うようにすればもっと簡単に処理ができるはずです。
また、「同じ文字数」という指定もいらなくなります。
http://www9.plala.or.jp/sgwr-t/rei6-31.htm


友葉さん、ともじさん、ありがとうございました。
教えていただいた情報・ヒントをもとに自分なりにトライ
してみます。またわからないことがあったらくるかもしれません。
今度は具体的なコードをもってこれるようがんばてみます。

戻る


「初心者のためのポイント学習C言語」 Last modified:2001.11.15
Copyright(c) 2000-2002 TOMOJI All Rights Reserved