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

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

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

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

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

1407閲覧

C言語:2次元配列に格納された「全角」文字列を選択ソートしたい

Reg_py

総合スコア13

C

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

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/05/19 08:34

編集2020/05/19 08:59

c言語で、文字列を格納した2次元配列をソートしたいのですが
全角文字列だとどうもうまくいきません。。
おそらくselectionSort関数の書き方が悪いのですが,
どこらへんがおかしい挙動をうんでしまっているのか教えていただきたいです。
どう改善すればいいのかも教えていただけると嬉しいです。

以下試したことです。

c言語

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5#define N 256 // 1単語(形態素)のバイト長 6 7void selectionSort(char numbers[N][256], int array_size) 8{ 9 int i; // 配列の先頭を指すインデックス 10 int j; // 残りの要素を指すインデックス 11 int min; // 最小値を持つ要素のインデックス 12 char temp[N]; // 交換用の一時変数 13 14 for (i = 0; i < array_size - 1; i++) { 15 min = i; // 配列の先頭を最小値の要素とする 16 for (j = i+1; j < array_size; j++) { // 比較のループ 17 if (strcmp(numbers[min], numbers[j]) > 0 ) { 18 min = j; // 最小値を持つ要素を更新 19 } 20 } 21 // 最小値を持つ要素を先頭の要素と交換 22 strcpy(temp, numbers[i]); 23 strcpy(numbers[i], numbers[min]); 24 strcpy(numbers[min], temp); 25 } 26} 27 28//簡単な確かめ文 29int main(void) { 30 31 int i = 0; 32 char v[N][256] = {"あ", "い", "あう"}; 33 selectionSort(v, N); 34 for(i=0;i<7;i++) 35 printf("%s",v[i]); 36 37 return 0; 38 39}

出力結果
Illegal instruction: 4

main文を少し変更して,

c言語

1int main(void) { 2 3 int i = 0; 4 char v[N][256] = {"a", "b", "a"}; 5 selectionSort(v, 3); 6 for(i=0;i<7;i++) 7 printf("%s",v[i]); 8 9 return 0; 10 11}

出力結果
Illegal instruction: 4

関数の第二引数の「3」を「N」に変えると

出力結果
Illegal instruction: 4

以上試したことでした。

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

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

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

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

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

cateye

2020/05/19 08:41 編集

strcmp()は、負の整数、0、正の整数が返ってくるのは知っていますか? →http://www.c-tipsref.com/reference/string/strcmp.html
Reg_py

2020/05/19 08:45

勘違いしてました... 訂正して考え直します
guest

回答2

0

char v[N][256] = {"あ", "い", "あう"};

selectionSort(v, N);

vにある「文字列」の数は、3なので、 selectionSort(v, 3); じゃないですか?

-- あっと、
selectionSort()の引数 numbers の最初の要素数は、不要。

void selectionSort(char numbers[][N], int array_size)

で、

C

1 char v[N][256] = {"あ", "い", "あう", "ふふ", "いい"}; 2 selectionSort(v, 4);

とすると、最後の文字列はソート対象から、外れます。

投稿2020/05/19 11:54

編集2020/05/19 11:58
pepperleaf

総合スコア6385

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

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

Reg_py

2020/05/19 12:04

回答ありがとうございます。 v[N][256]の二次元配列に何個文字列が格納されているかわからないときにすべてソートしたいという場合はどうなるのでしょうか・
pepperleaf

2020/05/19 12:08

C言語の場合、何個あるか判別する方法は無いと思います。 ただ、初期値として、それぞれの文字配列を "\o" で初期化しておけば、無いとみなせるでしょう。(比較処理もそれに対応する)
Reg_py

2020/05/19 12:30

(v, N)の場合でも空文字としてソートでき,自分の求めていた動きになったのでよかったです!自分の環境が問題だったみたいです。ありがとうございました!
guest

0

ベストアンサー

usr ~/Project/test % ./a.out

あう

・・・ちょっと直しましたが、合っているような?

c

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5#define N 256 // 1単語(形態素)のバイト長 6 7static void selectionSort(char numbers[N][256], int array_size) 8{ 9 int i; // 配列の先頭を指すインデックス 10 int j; // 残りの要素を指すインデックス 11 int min; // 最小値を持つ要素のインデックス 12 char temp[N]; // 交換用の一時変数 13 14 for(i = 0; i < array_size - 1; i++) { 15 min = i; // 配列の先頭を最小値の要素とする 16 for(j = i + 1; j < array_size; j++) { // 比較のループ 17 if(strcmp(numbers[min], numbers[j]) > 0) { 18 min = j; // 最小値を持つ要素を更新 19 } 20 } 21 // 最小値を持つ要素を先頭の要素と交換 22 strcpy(temp, numbers[i]); 23 strcpy(numbers[i], numbers[min]); 24 strcpy(numbers[min], temp); 25 } 26} 27 28//簡単な確かめ文 29int main(void) 30{ 31 int i = 0; 32 char v[N][256] = {"あ", "い", "あう"}; 33 // 34 selectionSort(v, 3); 35 // 36 for(i = 0; i < 3; i++){ 37 if( v[i][0]){ 38 printf("%s\n", v[i]); 39 } 40 } 41 // 42 return 0; 43}

投稿2020/05/19 10:00

編集2020/05/19 15:31
cateye

総合スコア6851

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

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

cateye

2020/05/19 10:06 編集

selectionSort()に感しては、ワーニングが出るので、static付けただけです。 環境は何でしょう・・・関係ないとも思いますが、文字コードが気になるのですが? こちらはUTF-8
Reg_py

2020/05/19 11:36

OS:macOS Catalina 開発環境:CLion 文字コード:UTF-8  です。 cateyeさんのコードをそのままコピペして貼ってもIllegal instruction: 4のエラーが表示されました。
Reg_py

2020/05/19 11:41

cateyeさんの方では,main関数でselectionSort関数を呼び出すときに(v,3)→(v, N)と変えて,for文の場所も3→Nに変えてもエラーは表示されませんか?二次元配列の格納する文字列を漢字にしたり、増やしたりしても変わらず動きますか?注文多くて申し訳ないです。
Reg_py

2020/05/19 12:21 編集

windowsでやったらいけました。
cateye

2020/05/19 12:59

{"あ", "ゲーム", "い", "Mint", "あう", "いろは", "Linux", "ジャンル", "格闘"}; で、Nに変えても、問題なかったですね?・・・ Linux Mint あ あう い いろは ゲーム ジャンル 格闘 usr ~/Project/test % ./a.out|wc 256 9 313 頭に改行いっぱいですがw
Reg_py

2020/05/19 14:14

わざわざありがとうございます!Windowsの方のCLionでやったらcateyeさんと同じようになりました!macOSがダメだったんですかね。それはまた追々考えることにします。長々と丁寧にありがとうございました!
cateye

2020/05/19 15:33 編集

ソース修正(空の文字列は出力しない)しました。 macにはclang入れられなかたっけ?・・・xcodeだったか? 最新版でなくても大丈夫と思うから入れて、コンパイルしてみて下さい。 うちのは、clang 10.0 です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問