🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

5452閲覧

ファイルから読み込んだ文字列をアルファベット順に並べたいのですが

hiro0215

総合スコア15

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2019/10/09 03:36

編集2019/10/09 03:55

初めて質問させていただきます。C言語初心者です。

ファイル(sort.txt)から読み込んだ
AA
CC
BB
EE
DD

をアルファベット順に並べたいのですが、読み込んで表示する事は出来たのですが並べ替える方法がわかりません。
色々なサイトを参考にしてみたのですが、どうしてもソートの部分で止まってしまい、読みこみの時点で既に間違えているのか、組み込み方が違うのかわかりません。

読み込みは以下のようにやりました。

#include <stdio.h>
#include <stdlib.h>

int cmp(const void a, const void b)
{
return strcmp(
(const char
*)a,*(const char **)b);
}

int main()
{
char a[5][3];
int i;

FILE *file;
file=fopen("sort.txt","r");

if(file == NULL)
{
printf("ファイルオープン失敗");
return 0;
}

fscanf(file,"%s",a[0]);
fscanf(file,"%s",a[1]);
fscanf(file,"%s",a[2]);
fscanf(file,"%s",a[3]);
fscanf(file,"%s",a[4]);

for(i=0;i<5;i++)
{
printf("%s¥n",a[i]);
}

qsort(a,5,sizeof *a,cmp);

for(i=0;i<5;i++)
{
printf("%s¥n",a[i]);
}

fclose(file);
}

という形にしました。
何がおかしいのか、何を勉強し直すべきなのか、アドバイスいただけたらありがたいです。
よろしくお願いします。

追記:参考にしたサイトのqsortをそのまま載せました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2019/10/09 03:42 編集

ソートしてないですね。qsort を調べてください。ポインタのポインタを使うので、少しハードル高いかもしれませんが。
cateye

2019/10/09 03:49

ソートそのものが書かれていない・・・は、置いといてfopen()やfscnf()のエラーチェックぐらいしましょう。
guest

回答3

0

return strcmp((const char)a,(const char )b); を
return strcmp((const char*) a, (const char*) b);
に変えてください。

投稿2019/10/09 05:34

tatsu99

総合スコア5493

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

追記:参考にしたサイトのqsortをそのまま載せました。

そのサイトはどこですか?

並べ替えたいのは、char a[5][3] に入った "AA" や "CC" ですね。
この並べ替えたいものの型は、char [3] という配列です。
関数 cmp には、その配列へのポインタが渡されてきます。
これはポインタへのポインタではありません。

return strcmp((const char)a,(const char )b);

return strcmp((const char ()[3])a, (const char ()[3])b);
に変えてみてください。

追記
ベストアンサーになったということは、この回答を見たんですよね。

「そのサイトはどこですか?」という質問になぜ答えてくれないのでしょうか?
どこのサイトであろうと、
return strcmp((const char)a,(const char )b);
と書いているはずがないのです。
a の型を const char にキャストしたら、それはポインタではないので、
*演算子を使うとエラーになるからです。

次に、tatsu99 さんの回答の方がベストアンサーだと思います。

return strcmp((const char ()[3])a, (const char ()[3])b);
も間違いではないのですが、これは、
a の型が const void * なのを
(const char ()[3])a の型が const char ()[3] となるように変換しています。
これはポインタですから、*演算子により、
(const char ()[3])a の型が、const char [3] になります。
これは配列なので、配列の先頭要素へのポインタである const char * に
暗黙の変換が行われます。
したがって、(const char *)a でよいのです。

投稿2019/10/09 04:52

編集2019/10/10 02:09
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

「C言語 ソート」でぐぐるとサンプルコード含め記事がたくさん出てきます

投稿2019/10/09 03:45

y_waiwai

総合スコア88038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問