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

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

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

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

Q&A

解決済

2回答

14155閲覧

アルファベット順 文字列のソート

slushii

総合スコア19

C

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

0グッド

0クリップ

投稿2018/10/29 02:53

前提・実現したいこと

与えられた文字列をアルファベット順に並び替えて表示するプログラムを書いていますが、上手く実行できません。
誤っている箇所を教えて頂きたいです。よろしくお願い致します。

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

Segmentation fault

該当のソースコード

#include <stdio.h> #include <string.h> void sort(int no, char *month){ int temp, i, j; for(i=0; i<no; i++){ for(j=i+1; j<no; j++){ if(strcmp((month+i),(month+j))<0){ temp = *(month+i); *(month+i) = *(month+j); *(month+j) = temp; } } } } int main( void ){ int i, no; char *month[] = {"January", "February", "March","April", "May","June", "July", "August", "September", "October", "November", "December",NULL}; no = sizeof(month)/sizeof(month[0]); sort(no, *month); for(i=0; i<no; i++) printf("month[%d]=%s\n", i, month[i]); return 0; }

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

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

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

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

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

guest

回答2

0

ベストアンサー

修正しておきました。

C

1#include <stdio.h> 2#include <string.h> 3 4void sort(int no, char *month[]){ 5 int i, j; 6 char *temp; 7 for(i=0; i<no; i++){ 8 for(j=i+1; j<no; j++){ 9 if(strcmp((month[i]),(month[j]))>0){ 10 temp = *(month+i); 11 *(month+i) = *(month+j); 12 *(month+j) = temp; 13 } 14 } 15 } 16} 17 18int main( void ){ 19 int i, no; 20 char *month[] = {"January", "February", "March","April", "May","June", 21 "July", "August", "September", "October", "November", "December",NULL}; 22 23 no = sizeof(month)/sizeof(month[0]); 24 no--; 25 sort(no, month); 26 27 for(i=0; i<no; i++) 28 printf("month[%d]=%s\n", i, month[i]); 29 30 return 0; 31 32} 33

投稿2018/10/29 03:44

tatsu99

総合スコア5436

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

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

slushii

2018/10/29 18:57

ご丁寧にありがとうございました。
guest

0

sort(no, *month);

文字列の配列を渡したいと見えますが、ここはそうなっていません。
sort関数本体も、文字列の交換ではなく、文字の交換になってしまっています。
そのため、文字列定数のエリアを変更しようとしてエラーが出ているものと推察されます

投稿2018/10/29 03:09

編集2018/10/29 03:11
y_waiwai

総合スコア87747

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

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

slushii

2018/10/29 03:15

ご回答ありがとうございます。 教えて頂いた意味は理解できました、ありがとうございます。 ただ具体的な変更はどのように行なえばよいかわかりません、、、 教えていただけますか?
y_waiwai

2018/10/29 03:22

とりあえず, > void sort(int no, char *month){ を、 void sort(int no, char *month[]){ としてみましょう #これできちんと動くかどうかはべつのはなし で、Eclipseや、WindowsならVisualstudioを入れるなりして、C言語のデバッグ環境を構築しましょう。 任意の行で実行を止めたり、変数のナカミをモニタできるようになります。
y_waiwai

2018/10/29 03:24

追記、 sort(no, month); ね
slushii

2018/10/29 19:03

ご丁寧にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問