• ベストアンサー

アルファベットの並べ替え

C言語で文字を読み込んで並べ替えをしたいのですが、 void mojiSort(char *h[ ], int n){ int i, j; char *temp; for (i = 0; i < n - 1; i++) { for (j = i + 1; j < n; j++) { if (strcmp( h[j], h[i]) < 0) { temp = h[i]; h[i] = h[j]; h[j] = temp; } } } return ; } とすると大文字、小文字を分けて並べ替えてしまいます。 「A」の後に「a]がくるようにするにはどうしたらよいでしょうか?

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

  • ベストアンサー
  • shred
  • ベストアンサー率35% (25/70)
回答No.1

比較をする際に、小文字ないし大文字に両者を統一したものを比較することによって回避できると思います。同じだった場合は大文字を先にすればいいと思います。

rrrkkkks
質問者

お礼

ありがとうございます。最終的に出力したいので文字を統一すると、出力するときに文字が変わってしまうという事はないのでしょうか? C言語は勉強を始めたばかりなのでよく分からないのですが…

その他の回答 (3)

noname#48699
noname#48699
回答No.4

>・・C言語の勉強をしているので、・・ 全くのオジャマ虫で申し訳ない。 #3回答者さまが言っているのは、以下のようではないかと・・・。 #include <ctype.h> int str_new( char cLeft[], char cMigi[] ) {  int iLenLeft, iLenMigi, i;  iLenLeft = strlen( cLeft );  iLenMigi = strlen( cMigi );  for( i = 0; i < iLenLeft; i++ ){   if( i > iLenMigi ) return( 1 );   if( NULL == isalpha( cLeft[i] ) ){ // 英文字でない    if( cLeft[i] < cMigi[i] ) return( -1 );    if( cLeft[i] > cMigi[i] ) return( 1 );   }   if( NULL == isalpha( cMigi[i] ) ){ // too    if( cLeft[i] < cMigi[i] ) return( -1 );    if( cLeft[i] > cMigi[i] ) return( 1 );   }   if( toupper( cLeft[i] ) < toupper( cMigi[i] ) ) return( -1 );   if( toupper( cLeft[i] ) > toupper( cMigi[i] ) ) return( 1 );  }  return( 0 ); // 同一 } 注:タブの替わりに全角空白を用いています。

rrrkkkks
質問者

お礼

わざわざソースをかいて頂きありがとうございました。 色々としてたらなんとかできました。

  • shred
  • ベストアンサー率35% (25/70)
回答No.3

実データは変更しません。 例えばtoupper関数は渡した文字を大文字で返します。 このときは実データは大文字に変更されません。 返り値が大文字になるだけです。 つまり、toupper関数の評価値同士を比べればいいと思います。

rrrkkkks
質問者

お礼

ありがとうございました。 無事なんとかできました。

  • noocyte
  • ベストアンサー率58% (171/291)
回答No.2

ロケールがサポートされている環境ならば,最初に setlocale(LC_COLLATE, ロケール名) で英語ロケールなどを設定しておいて,strcmp() の代わりに strcoll() などを使えば, 文字コード順じゃなくてロケールの辞書順で比較してくれるはず. (自分では使ったことないけど.) strcoll 系関数 (MSDN) http://msdn.microsoft.com/library/ja/vclib/html/_CRT_strcoll_Functions.asp?frame=true strcoll() のマニュアル (Linux) http://www.linux.or.jp/JM/html/LDP_man-pages/man3/strcoll.3.html ただ,C言語やプログラミングの勉強のためだったら自分で #1 さんの ような処理を実装する方がいいと思います.

rrrkkkks
質問者

お礼

ありがとうございます。できればC言語の勉強をしているので、shredさんのような事をしたいのですが、うまく実装できませんでした。どのような事に気をつけてするといいのでしょうか?