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

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

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

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

Q&A

3回答

724閲覧

アルファベット文字列をstrを使わずに昇順にソート、表示する。

nbvcc

総合スコア1

C

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

0グッド

1クリップ

投稿2021/04/30 09:02

前提・実現したいこと

C言語です
char s[][10] = { "JAY","FARY","RCH","AIL","MY"
,"JE","JY","AST","SER","OCER","NER","DER" }, tmp[12];という初期値が与えられていて、この文字列をstrcpyを使わずにアルファベット順にソート、表示したいです。

発生している問題・エラーメッセージ

エラーは出ず、3つの文字列だけ昇順に表示されました。

エラーメッセージ

該当のソースコード

C言語

1#include<stdio.h> 2#define TUKI 11 3 4int main(void) { 5 6 int i, j, k; 7 8 char s[][10] = { "JAY","FARY","RCH","AIL","MY" 9 ,"JE","JY","AST","SER","OCER","NER","DER" }, tmp[12]; 10 11 for (i = 0; i < TUKI; ++i) { 12 for (j = i + 1; j < TUKI; ++j) { 13 if (s[i][0] > s[j][0]) { 14 for (k = 0; k < 10; k++) { 15 tmp[k] = s[j][k]; 16 s[i][k] = s[j][k]; 17 s[j][k] = tmp[k]; 18 } 19 } 20 } 21 } 22 for (i = 0; i < TUKI; ++i) 23 printf("%s\n", s[i]); 24}

試したこと

補足情報(FW/ツールのバージョンなど)

visual studio2019
ここにより詳細な情報を記載してください。

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

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

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

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

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

1T2R3M4

2021/04/30 09:15

debugしていないのですか。
nbvcc

2021/04/30 09:33

ビルド実行してエラーメッセージは出ませんでした
dodox86

2021/04/30 09:47

> ビルド実行してエラーメッセージは出ませんでした それはデバッグとは言わないのでは。 少なくとも if ([i][0] > s[j][0])) { の部分で、頭の1文字しか比較していませんし、TUKIは11だけど、char s[][10]の要素は12個あったりします。
guest

回答3

0

こんなんで。

C

1#include <stdio.h> 2#include <stdlib.h> 3 4int comp(const void* x, const void* y) { 5 const char* sx = (const char*)x; 6 const char* sy = (const char*)y; 7 while ( *sx != '\0' && *sy !='\0' && *sx == *sy ) { 8 ++sx; 9 ++sy; 10 } 11 return *sx - *sy; 12} 13 14int main() { 15 char s[][10] = { "JAY", "FARY", "RCH", "AIL", "MY", "JE", 16 "JY", "AST", "SER", "OCER", "NER", "DER" }; 17 qsort(s,12,10,&comp); 18 for ( int i = 0; i < 12; ++i ) { 19 printf("[%s] ", s[i]); 20 } 21 return 0; 22}

投稿2021/04/30 12:47

episteme

総合スコア16612

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

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

0

先頭文字だけ比較するのではなく、先頭から順番に比較していき、
k 番目が異なると分かった時に逆順なら交換すればよいでしょう。

c

1#include <stdio.h> 2 3#define TUKI (sizeof s / sizeof s[0]) 4 5int main(void) 6{ 7 int i, j, k; 8 9 char s[][10] = { "JAY","FARY","RCH","AIL","MY","JE", 10 "JY","AST","SER","OCER","NER","DER" }, tmp; 11 12 for (i = 0; i < TUKI; ++i) { 13 for (j = i + 1; j < TUKI; ++j) { 14 for (k = 0; s[i][k] == s[j][k]; k++) 15 if (s[i][k] == '\0') break; 16 if (s[i][k] > s[j][k]) { 17 for ( ; k < 10; ++k) { 18 tmp = s[i][k]; 19 s[i][k] = s[j][k]; 20 s[j][k] = tmp; 21 } 22 } 23 } 24 } 25 for (i = 0; i < TUKI; ++i) 26 printf("%s\n", s[i]); 27}

投稿2021/05/01 01:32

kazuma-s

総合スコア8224

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

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

0

文字列へのポインタの配列を作って、 C標準のqsort()を使うのはどうでしょう。
ソートアルゴリズムを実装しなくてよくなります

投稿2021/04/30 10:42

hide5stm

総合スコア426

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問