- 締切済み
「ポインタのポインタ」を使った文字列のソート方法?
初めて質問を投稿させていただきます。 どうぞよろしくお願いします。 現在、C言語の勉強として、 「ポインタのポインタ」を使って「コマンドラインから入力された複数の文字列を昇順にソートして表示するプログラム」 を作っているのですが、 (main関数とソート用関数は分け、出力処理はmainの中でやります) 引数として何を渡せばいいのか、またソートで何を比較して、何を入れ替えれば良いのか、考えれば考えるほど混乱してしまいます。 (過去の質問も一通り調べてみたつもりですが、解決の手がかりとなるものが見つかりませんでした) それで、どうコーディングすればいいのかを解説して頂きたいのですが、 投稿できる文字数が限られているという事なので、私が未熟なりに作ったプログラムを、見て頂くに必要と思われる部分のみ載せさせて頂きます。 int main(int argc , char** argv) { int i = 0; /* カウンタ */ sort(argc-1,argv+1);/* sort関数 */ for(i = 1 ; i < argc ; i++) /* 出力ループ */ { printf("%s\n",*(argv+i)); /* ソート後文字列出力 */ } return 0; } /* main関数ここまで */ void sort(int sargc,char** sargv) { int i1 = 0; /* ソート用カウンタ・一時領域 */ int i2 = 0; char* temp = NULL; for(i1 = 0 ; i1 < sargc - 1 ; i1++) { for(i2 = i1 + 1 ; i2 < sargc ; i2++) { if(*(sargv + i1) < *(sargv + i2)) { temp = *(sargv + i1); /* 入れ替え */ *(sargv + i1) = *(sargv + i2); *(sargv + i2) = temp; } } } return; } } なお、実行結果は、例えば、 「実行ファイル名 suzuki tanaka satou」 と入力すれば、 satou suzuki tanaka と出力されるようにしたいと考えています。 どうぞよろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#include <stdio.h> #include <string.h> void sort(int sargc,char** sargv); int main(int argc , char** argv){ int i; sort(argc-1,argv+1); for(i = 1 ; i < argc ; i++){ printf("%s\n",*(argv+i)); /* ソート後文字列出力 */ } return 0; } void sort(int sargc,char** sargv){ int i1, i2; char* temp; for(i1 = 0 ; i1 < sargc - 1 ; i1++){ for(i2 = i1 + 1 ; i2 < sargc ; i2++){ if(strcmp(sargv[i1] , sargv[i2])>0){ temp = sargv[i1]; /* 入れ替え */ sargv[i1] = sargv[i2]; sargv[i2] = temp; } } } return; }
次は、私が、JavaScript の学習のために作成したソートコードです。 カーニハン・リッチー著の「プログラミング言語C」の例題の応用です。 多少は、参考になるかも知れません。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"> <html> <title>クイックソート</title> <meta http-equiv="Content-script-Type" content="type"> <script type="text/javascript"> function qsort(v, left, right) { var i, last; if (left >= right) return; swap(v, left, Math.round((left + right) / 2)); last = left; for (i=left + 1; i <= right; i++) if (v[i] < v[left]) swap(v, ++last, i); swap(v, left, last); qsort(v, left, last - 1); qsort(v, last + 1, right); } function swap (v, i, j) { var temp; temp = v[i]; v[i] = v[j]; v[j] = temp; } </script> <body> <script> <!-- var v = new Array("10","20","11","19","12","18","13","17","14","16","15"); qsort(v, 0, 10); for (i = 0; i < 11; i++) document.write(v[i], "<br/>"); //--> </script> </body> </html>
- jacta
- ベストアンサー率26% (845/3158)
とりあえず動くものを... #include <stdio.h> #include <stdlib.h> #include <string.h> int compare(const void* lhs, const void* rhs) { return strcmp(*(const char**)lhs, *(const char**)rhs); } int main(int argc, char *argv[]) { int ac = argc - 1; char *av[ac]; memcpy(av, argv+1, sizeof(av)); qsort(av, ac, sizeof(char*), &compare); for (int i = 0; i < ac; i++) puts(av[i]); return 0; } 一応、勉強の余地を残しておくために、意図的にC99でなければコンパイルできないようにしています。