
初めて質問を投稿させていただきます。
どうぞよろしくお願いします。
現在、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件)
- 最新から表示
- 回答順に表示
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;
}
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>
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
文字列から空白を取り除きたい...
-
配列をnビットシフトする
-
charでの計算?
-
Linuxでフォルダ内全ファイル名...
-
CStringをwchar_tに変換したい
-
宣言による処理の重さ
-
コマンドラインに入力されてい...
-
<>で囲まれた文字列を文字列の...
-
YUV⇔RGB変換がうまくいきません。
-
間接操作のレベルとは
-
charからLPTSTRへの変換方法
-
干支のプログラム
-
double型の値をchar配列に変換...
-
【C言語】テキストファイル内の...
-
sprintfに同じ変数は使えるか
-
PROCのコンパイルエラーの取り...
-
入力された文字列から整数だけ...
-
iconv_open失敗
-
至急!C言語文字列置換
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
文字列から空白を取り除きたい...
-
CStringをwchar_tに変換したい
-
charからLPTSTRへの変換方法
-
テキストデータをそのままバイ...
-
c++ 文字列を入力して、一文字...
-
'const char *' 型は 'char *' ...
-
間接操作のレベルとは
-
WORDをcharに変換する方法
-
strncpyと_tcsncpy_sのヌルの扱...
-
型変換
-
配列をnビットシフトする
-
atoi( ) の反対をやりたい
-
Win32APIでのエディットボック...
-
間接参照のレベルが異なっています
-
c言語配列の結合についてです。...
-
【C言語】テキストファイル内の...
-
double型の値をchar配列に変換...
-
switch文で文字を比較すること...
-
C言語のfor文です。 繰り返しの...
おすすめ情報