「ポインタのポインタ」を使った文字列のソート方法?
初めて質問を投稿させていただきます。
どうぞよろしくお願いします。
現在、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
と出力されるようにしたいと考えています。
どうぞよろしくお願いします。
#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>
とりあえず動くものを...
#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でなければコンパイルできないようにしています。
- 最新から表示
- |
- 回答順に表示











