質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

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

Q&A

解決済

2回答

7688閲覧

文字列の並び替え アルファベット順

slushii

総合スコア19

C

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

0グッド

0クリップ

投稿2018/10/24 13:47

以下のような文字列を文字数の小さい順に、同文字数ならアルファベット順に並び替えたいのですが考えが浮かびません。
なにかアドバイスを頂けたらと思います。よろしくお願いいたします。

c

1int main(void){ 2 char *[month] = {"January", "February", "March", 3 "April", "May", "June", "July", "August", 4 "September", "October", "November", 5 "December",NULL}; 6 7 return 0; 8 }

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

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

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

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

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

archiver

2018/10/24 14:01

どこまでの実装を考えてますか?比較や並べ替えまで1から作るんでしょうか。ある程度は標準ライブラリを使うでいいんでしょうか?
slushii

2018/10/24 14:18

当方超初心者ですので、できるだけ1から作りたいと考えております。よろしくお願いいたします。
guest

回答2

0

クイックソートで書いてみました。

c

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5int string_compar(const void* s1, const void* s2) { 6 char * str1 = *(char**)s1; 7 char * str2 = *(char**)s2; 8 int ret = strlen(str1) - strlen(str2); 9 if (ret == 0) { 10 ret = strcmp(str1, str2); 11 } 12 return ret; 13} 14 15int main() { 16 char * month[] = 17 { 18 "January", "February", "March", "April", "May", "June", 19 "July", "August", "September", "October", "November", "December" 20 }; 21 22 int n = sizeof(month)/sizeof(month[0]); 23 qsort(month, n, sizeof(char *), string_compar); 24 for (int i = 0; i < n; i++ ) { 25 printf("%s\n", month[i]); 26 } 27}

参考情報

  • qsortを使って文字列群をソートする

https://c.just4fun.biz/?%E3%82%BD%E3%83%BC%E3%83%88/qsort%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E6%96%87%E5%AD%97%E5%88%97%E3%81%AE%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E3%81%AE%E3%82%BD%E3%83%BC%E3%83%88%E3%82%92%E8%A1%8C%E3%81%86

投稿2018/10/26 14:38

katoy

総合スコア22324

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

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

0

ベストアンサー

ソートアルゴリズムはなんでもいいですが、比較部分で以下の関数を使用します。

  1. 文字列の長さ比較 strlen()
  2. 文字列の順序比較 strcmp()

要素 a, b を strlen() で長さを計算し、比較する。
もし長さが同じ場合は、strcmp() で辞書順で比較する。

バブルソートの実装例

c

1#include <stdio.h> 2#include <string.h> 3 4int main() 5{ 6 char *month[] = {"January", 7 "February", 8 "March", 9 "April", 10 "May", 11 "June", 12 "July", 13 "August", 14 "September", 15 "October", 16 "November", 17 "December"}; 18 size_t len = sizeof(month) / sizeof(month[0]); 19 20 printf(">>>>> before\n"); 21 for (int i = 0; i < len; ++i) 22 printf("%s\n", month[i]); 23 24 // バブルソート 25 ////////////////////////////////////////////// 26 for (int i = 0; i < len - 1; ++i) { 27 for (int j = len - 1; j > i; --j) { 28 size_t len1 = strlen(month[j]); 29 size_t len2 = strlen(month[j - 1]); 30 31 if (len1 < len2 32 || (len1 == len2 && strcmp(month[j], month[j - 1]) < 0)) { 33 // swap 34 char *temp = month[j]; 35 month[j] = month[j - 1]; 36 month[j - 1] = temp; 37 } 38 } 39 } 40 41 printf(">>>>> after\n"); 42 for (int i = 0; i < len; ++i) 43 printf("%s\n", month[i]); 44} 45
>>>>> ソート前 January February March April May June July August September October November December >>>>> ソート後 May July June April March August January October December February November September

投稿2018/10/24 14:17

編集2018/10/24 14:18
tiitoi

総合スコア21956

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

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

slushii

2018/10/24 22:44

丁寧に説明してくださりありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問