- ベストアンサー
アルファベットの並べ替え
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]がくるようにするにはどうしたらよいでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
比較をする際に、小文字ないし大文字に両者を統一したものを比較することによって回避できると思います。同じだった場合は大文字を先にすればいいと思います。
その他の回答 (3)
>・・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 ); // 同一 } 注:タブの替わりに全角空白を用いています。
お礼
わざわざソースをかいて頂きありがとうございました。 色々としてたらなんとかできました。
- shred
- ベストアンサー率35% (25/70)
実データは変更しません。 例えばtoupper関数は渡した文字を大文字で返します。 このときは実データは大文字に変更されません。 返り値が大文字になるだけです。 つまり、toupper関数の評価値同士を比べればいいと思います。
お礼
ありがとうございました。 無事なんとかできました。
- noocyte
- ベストアンサー率58% (171/291)
ロケールがサポートされている環境ならば,最初に 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 さんの ような処理を実装する方がいいと思います.
お礼
ありがとうございます。できればC言語の勉強をしているので、shredさんのような事をしたいのですが、うまく実装できませんでした。どのような事に気をつけてするといいのでしょうか?
お礼
ありがとうございます。最終的に出力したいので文字を統一すると、出力するときに文字が変わってしまうという事はないのでしょうか? C言語は勉強を始めたばかりなのでよく分からないのですが…