• ベストアンサー

文字列を比較するプログラムなんですが…

同じ長さの文字列2個(s1、s2)を辞書的に比較してs1>=s2なら1、s1<s2なら0を返すプログラムを作成せよ。 尚、文字列は小文字でポインタを使う事。 s1がab、s2がacと入力されたならs1>s2となります。 という問題がだされたんですが全くわかりません…。 どなたかご助力お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

noboru2000さんもjactaさんも正しい回答です。 しかし、この問題の真意は「ポインタを使って比較をするプログラムを作成せよ」だと思います。 ということは、strcmp()などの標準関数を使っては作成したことにはなりません。 なのでプログラムは以下のようになります。 ---------------------------------------------------------------- #include <stdio.h> int func( const char *s1, const char *s2 ); void main() {  char s1[ 256 ];  char s2[ 256 ];  int ret;  // 文字列の入力  printf("文字列1="); gets( s1 );  printf("文字列2="); gets( s2 );  // 比較処理  ret = func( s1, s2 );  // 結果の表示  printf("結果=%d\n", ret ); } int func( const char *s1, const char *s2 ) {  // s1の文字列の長さだけ繰り返す  while( *s1 != '\0' )  {   // C言語の文字比較では 'a' < 'b' になるので   // ここでの比較は(s1の参照文字 > s2の参照文字)となります   if( *s1 > *s2 )   {    // (s1 < s2)なので0を返す    return 0;   }   // 次の文字を参照   s1++;   s2++;  }  // (s1 >= s2)なので1を返す  return 1; } ---------------------------------------------------------------- 理解できたでしょうか(^_^) まだ分からないことがありましたら 追って連絡をください。

3298999i
質問者

お礼

ありがとうございます!。 レポート提出期限にも間に合いホントに助かりました。 ちゃんと理解もできました~(^-^。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

回答No.5

1. char* p1 = s1; char* p2 = s2; 2. *p1 == '\0' || *p2 == '\0' なら '\0' だった方が小さい 3. *p1 < *p2 なら s1が小さい 4. *p1 > *p2 なら s2が小さい 5. *p1 == *p2 なら ++p1; ++p2; して[2]に戻る

3298999i
質問者

お礼

なるほど~。 家にはC++のコンパイラがないので今度学校で試してみようと思います!。ありがとうございました(^-^。

全文を見る
すると、全ての回答が全文表示されます。
  • nshooter
  • ベストアンサー率25% (2/8)
回答No.4

うふふ。これ学校の宿題でしょ?ここで手伝ってもらうのもいいけれど、 これはC言語の初歩の初歩。どんな初心者向けの入門書にもこの程度の 事は書いてあります。まさにこのプログラムで良いんですが、まったく 同じものを自分で見つけられるようにならないと、次の宿題困りますよ。

3298999i
質問者

お礼

はい、そうなんですよ…(^-^;。 一応最初は自力で調べてたんですけど見つけることができなくて…。 自分の力不足ですよね…。 春休みにまた最初からプログラムの勉強します!。

全文を見る
すると、全ての回答が全文表示されます。
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

文字コード順による単純比較ではなく、「辞書的に」というのが気になります。「辞書的に」というのは、具体的にはどのようなことを想定しているのでしょう? 多バイト文字のことなどもあわせて考えると、最も近いのはstrcollを使うことかもしれません。 C++であれば、collate<T>::compareまたはlexicographical_compareに適切な比較関数オブジェクトを指定することになると思います。 まあ、多分そこまで要求されていないとは思いますが...

3298999i
質問者

お礼

比較関数オブジェクトは使っちゃいけないことになってるんですよ。 それを使えば簡単に出来るんですが使えないので悩んます…。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

strcmp() で比較した結果を利用すればいいと思います。

3298999i
質問者

お礼

確かにその関数を使えば簡単にできます でもその関数を使っちゃいけないんですよ(><)。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 文字列を比較するプログラム

    キーボードより文字列aと文字列bを入力し、比較する(どちらが辞書並びで先かを表示する)プログラムを作れ。但し、strcmp関数を用いてはならない。 という問題があるんですが文字列の比較のしかたがまったくわかりません。わかりやすく教えていただけるとありがたいです。

  • Visual Basic 6.0の文字列の比較について

    二つの文字を比較し、同じ場合は[同じ文字列です]、違う場合[違う文字列です]と表示させるプログラムの作成してください。但し、メッセージボックスを使うこと。 このようなプログラムを作成するにはどうしたらいいのでしょうか?

  • 大文字の文字列→小文字の文字列

    C言語初心者です。 ある演習問題をやっていて詰まっています。 自分で入力した大文字の文字列を小文字にするプログラムを作るという問題なのですが、↓の条件があり、こんがらがってしまいました。 ・入力した文字列に小文字が含まれていたら、エラーと表示して再び入力を促し、0を入力するとプログラム終了という流れにする。 ・ポインタ変数を使う。 ・continue文を使う。 ・標準ライブラリ関数は使わない。 です。 ・continue文というのがよくわからない。 ・宣言した関数でどの処理をすればいいのかわからない。 ・大文字を小文字にするというプログラムがわからない。 (アスキーコードをどう使うのか) でつまっています。 どなたかアドバイス・解説・模範解答・指摘などしていただけないでしょうか。 よろしくお願い致します。

  • 文字列

    文字列をつかったプログラムの練習をしています。 friend fri end のように入力した文字列を半分ずつ表示するプログラムを作りたいんですけど 繰り返しやポインタを使わずに作ることはできますか?

  • 文字列の検索と比較

    文字列の検索と比較 以下の手順に従ってプログラムを作成せよ.適宜printf を利用して,入力支援(「文字列を入 力して下さい」などの画面表示)を行うこと. (1) 文字配列name[5][64] を作成する. (2) キーボードから5 人分の名前を入力し,name 配列に格納する. (3) キーボードから名前を入力し,name 配列の何番目に格納されているかを検索して表示 する.ただし,見つからなかった場合には,「見つかりません」と表示する. (4) 「quit」が入力されるまで(3)の処理を繰り返す. という処理です・・・・・。 #include <stdio.h> int main(void){ char name[5][36]; int i; for(i = 0; i < 5; i++ ){ printf("%d番目の名前を入力:", i + 1); scanf("%s", name[i] ); } printf("五人の名前を入力しました。\n"); printf("どこに格納されているか検索します。名前を入力:"); scanf("%s",name); /* ここに配列の何番目に格納されているかを検索して表示するプログラムを作成する ただし,見つからなかった場合には,「見つかりません」と表示する. 「quit」が入力されるまで処理を繰り返す処理を書く?? */ getchar(); getchar(); return(0); } 検索された文字と入力された文字が同じであることの処理はどうすればいいのでしょうか? 二つの配列を用意してループ文?でしょうか?

  • 文字列 ポインタ

    3つの文字ポインタを作成し,最初のポインタが「one」を,二番目のポインタが「two」を,三番目のポインタが「three」をさすように初期化するプログラムを作成しなさい.次にこれらの3つの文字列の順列をすべてプログラムに表示させなさい. という問題で順列をうまく並べる方法がわかりません.手打ちでprintを6個作ることはできますが... うまい方法があるかないか,どのような方法か教えてください.よろしくお願いします. #include<stdio.h> int main(void) { char *a,*b,*c,*t; int i; a="one"; b="two"; c="three"; printf("%s\t%s\t%s\n",a,b,c); return 0; }

  • 文字列のプログラムについて

    キーボードから入力された1行の文字列を逆順(abc -> cba)にして、 更に大文字なら小文字にし、小文字なら大文字にして表示するプログラムを作る問題です。 とりあえず getcharを使い、キーボードから文字列を入力しその文字列を 配列変数に保存し、その配列変数について変換させるのだと思いますが、 どうしてもgetcharでキーボードからえた文字列を配列変数にいれる方法がわかりません。 教えてください。

  • 文字列を表すための配列とポインタ

    文字列を表すための配列とポインタ  配列とポインタは同様に扱えるもの、と思って、次のプログラムを作りました。処理系は、Visual Studio 2010 コマンドプロンプトです。 #include <stdio.h> void main(void) { char a[256]; char *b; printf("文字列を入力してください。\n"); printf("例「abcde」\n\n"); printf("配列型文字列を使います。\n"); scanf("%s", a); printf("文字列は%sです。\n\n", a); printf("ポインタ型文字列を使います。\n"); scanf("%s", b); printf("文字列は%sです。\n", b); }  すると、まずコンパイル時に、 「warning C4700: 初期化されていないローカル変数'b'が使用されます」 と表示されました。そして、実行すると、「配列型文字列」の方は問題ないのですが、「ポインタ型文字列」の方の実行後に、 「x.exeは動作を停止しました。 問題が発生したため、プログラムが正しく動作しなくなりま した。プログラムは閉じられ、解決策がある場合は Windowsから通知されます。」 と表示され、エラーとして終了してしまいます。 「char *b;」 と宣言するところが問題のようですが、なぜなのかが分かりません。どなたか、解説をお願いします。

  • 文字列比較

    最長10文字の文字列を2件入力し、char型の配列にそれぞれ格納する。2つの文字列を比較し、文字列が同じだったら「equal」を表示し異なっていたら「Not equal」を表示するプログラムを作成せよという課題が出ました。 条件として、11文字以上の文字が入力されたら、先頭から10文字までを有効とし、11文字目以降を無視する。下記のプログラムで文字列1に11文字以上入力すると、うまく動きません。なぜ、うまくいかないかと、どうなおしたらよいかを教えてください。 #include<stdio.h> #include<string.h> #define max_length 10 void get_string (char *p_str, int size); int main() { char string1[max_length+2]; char string2[max_length+2]; printf("文字列1:"); get_string(string1,max_length+2); printf("文字列2:"); get_string(string2,max_length+2); if(!strncmp(string1,string2,max_length)) puts("equal"); else puts("Not equal"); } void get_string (char *p_str, int size) { fgets(p_str,size,stdin); }

  • 文字列中に含まれる文字の個数をカウントするプログラムについて…

    文字列、1文字が与えられたとき、これをポインタで入力し文字列中に含まれる文字の個数を計算するプログラムを作成せよ。 と、いう課題がだされたんですけど、ユーザが任意の文字列と1文字を入力できるようにすることができません…。 多分main関数の部分をちょっといじくればよいと思うのですが…。 どなたかアドバイスをお願いします。 #include <stdio.h> int count(const char *str, const char ch) { int cnt=0; while (*str!='\0') { if (*str==ch) cnt++; str++; } return cnt; } int main() { const char *str="hello,world!"; const ch='o'; int cnt; cnt=count(str, ch); printf("%s中に%cは%d個です\n", str, ch, cnt); return 0; }