• ベストアンサー

qsortの関数

qsortで昇順や降順にする用に関数を書き換えたり出来ますが・・ linuxで言う[sort -u [ファイル名]]のように 同じ文字列を見つけたときに 同じ行を削除するにはどうしたらよいのでしょうか? たとえば qwer asdf zxcv tyui ghjk vbnm asdf zxcv とファイルがあったとすれば ソート後 重なっている asdf zxcv を一行にまとめて表示したいのです。 linuxコマンドで言うまさに sort -u です。この場合「-u」が普通のソートと違うところだと思っています。 qsortで指定する関数を書けばいいのでしょうか? 詳しくお願いします。

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

qsort ではデータの個数は変化しないので, ソートしたあとで「前のデータと比較して, 違う場合に限って出力する」ことになるかと. ソートしたあとの処理を簡単に書くと char **p, **q; p = q = data; printf("%s\n", *p++); while (p < data + n) { if (strcmp(p, q)) { printf("%s\n", *p); } ++p; ++q; } って感じ.

その他の回答 (2)

  • amru05
  • ベストアンサー率63% (33/52)
回答No.2

 C++ならばstlのsetを使用すると簡単に出来ます。  set:集合コンテナ。同じ物は1つしか入らない便利    データ保存用の入れ物??? <使い方> 1)文字列をset<string>のコンテナに全てinsertする 2)set<string>のコンテナから順にデータを取り出せばユニークな文字列になります。 <ソース例:書いただけで動かしていないので??> std::set<string> sdat ; sdat.insert(string("qwer") ; sdat.insert(string("asdf") ; sdat.insert(string("zxcv") ; sdat.insert(string("tyui") ; sdat.insert(string("ghjk") ; sdat.insert(string("vbnm") ; sdat.insert(string("asdf") ; sdat.insert(string("zxcv") ; std::set<string>::iteroter sit ; for (sit=sdat.begin();sit!=sdat.end();sit++) { cout << *sit << endl ; } とすると文字列が重なっていても、一度しか出てきません。 (PS)  以前なら、sort関数を自分で作成して、その後、出力する時に以前の文字と同じかチェックして同じなら、出力しないようにする。。。関数を作成していましたが、毎回同じような事をするのは意味が無いので、c++のstlを使用しています。  set/mapなどの使い方だけでも覚えると本当に便利ですよ。

参考URL:
http://www.geocities.jp/ky_webid/cpp/library/009.html
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

qsortは並び替えをするだけですから、所望の動作をするには 配列を並び替える→ 配列を順に出力(このとき同じデータが連続していたら 最初のものだけ出力)のようにする必要があります。 sort hoge.xt | uniq のようなものです。sort -u は昔はありませんでした。

関連するQ&A