アプリ版:「スタンプのみでお礼する」機能のリリースについて

初めて質問を投稿させていただきます。
どうぞよろしくお願いします。

現在、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

と出力されるようにしたいと考えています。

どうぞよろしくお願いします。

A 回答 (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;
}
    • good
    • 1

次は、私が、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>
    • good
    • 0

とりあえず動くものを...



#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でなければコンパイルできないようにしています。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!