• 締切済み

「ポインタのポインタ」を使った文字列のソート方法?

初めて質問を投稿させていただきます。 どうぞよろしくお願いします。 現在、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 と出力されるようにしたいと考えています。 どうぞよろしくお願いします。

みんなの回答

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

#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; }

noname#22222
noname#22222
回答No.2

次は、私が、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)
回答No.1

とりあえず動くものを... #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でなければコンパイルできないようにしています。

関連するQ&A

専門家に質問してみよう