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

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

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

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

Q&A

解決済

3回答

460閲覧

c言語でセグメンテーションエラーが出ます

MCV

総合スコア6

C

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

0グッド

0クリップ

投稿2021/10/15 12:05

編集2021/10/15 12:16

c言語

1 2#include <stdio.h> 3#include <string.h> 4 5#define MAX_SIZE 10 6#define L_COUNT 5 7 8 9void func(char *c_buf,char **tag,char **last_char){ 10 int i; 11 12 tag[0] =c_buf; 13 for(i=0;i<L_COUNT;i++){ 14 if(fgets(tag[i],MAX_SIZE,stdin)== NULL){ 15 *tag[i]='\0'; 16 tag[i+1]=tag[i]+1; 17 18 } 19 20 else{ 21 *last_char=tag[i]+strlen(tag[i])-1; 22 if((**last_char=='\n')){ 23 *last_char='\0'; 24 tag[i+1]=*last_char+1; 25 // printf("-------\n"); 26 } 27 else{ 28 int get_data; 29 do{ 30 get_data=getchar(); 31 }while(!((get_data=='\n')||(get_data==EOF))); 32 tag[i+1]=*last_char+2; 33 } 34 } 35 } 36 37} 38 39void func2(char **tag){ 40 41 int i,j; 42 char *swap_buf; 43 44 for(i=0;i<L_COUNT;i++){ 45 printf("%d : %s\n",i,tag[i]); 46 } 47 48 for(i=0;i<(L_COUNT-1);i++){ 49 for(j=L_COUNT-1;j>i;j--){ 50 if(strncmp(tag[j-1],tag[j],MAX_SIZE-1)>0){ 51 swap_buf=tag[j]; 52 tag[j]=tag[j-1]; 53 tag[j-1]=swap_buf; 54 } 55 } 56 } 57 58 printf("\n\n"); 59 for(i=0;i<L_COUNT;i++){ 60 printf("%d:%s\n",i,tag[i]); 61 } 62} 63 64 65int main(){ 66 int i; 67 char c_buf[L_COUNT *MAX_SIZE]; 68 char *tag[L_COUNT +1], *last_char; 69 70 func(c_buf,tag,&last_char); 71 func2(tag); 72 73 74} 75 76

5つの文字列を入力してその文字列をアルファベット順に並び替えるプログラムを書いているのですが、コンパイルはできたのですが実行をしようとするとセグメンテーションエラーが出てしまいます。
関数funcで文字列を入力して、関数func2で文字列を並び替えています。

実行する際

blue
red

と2つ目の文字列を入力した後にセグメンテーションエラーが起きます。他の文字列でも同じでした。
どこが悪いのかわからないので分かる方教えていただきたいです。

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

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

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

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

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

guest

回答3

0

ベストアンサー

funcの引数 last_char に混乱が見られます。
名前の付け方もそうですが、main に戻ってきてから使わないのであれば、引数にしない方が良い気もします。

if((**last_char=='\n')){ *last_char='\0'; tag[i+1]=*last_char+1;

少なくともここを見ると、最初に **last_char に文字を格納している想定の比較をしているにも関わらず、次は *last_char に文字を格納していて矛盾があります。
最後、tagの要素に入るのは、数値0から変換されたポインタNULLに1足したものなので、アドレス値としては不正でしょう。
※これがセグメンテーションフォールトの根本原因に思えます。

なお、「どこが原因か」はデバッガで追えるようにした方が良いと思います。
高度な使い方をしなくても、デバッグ情報を埋め込んでコンパイルし、デバッガから実行かければ、最悪どこで落ちたかの情報を出してくれるはずです。

投稿2021/10/15 12:29

編集2021/10/15 12:30
angel_p_57

総合スコア1681

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

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

0

func関数の

C

1 *last_char='\0'; 2 tag[i+1]=*last_char+1;

この結果、どうなるでしょうか? tag[1+1]1 じゃないかと。

気が付いたところで。
(他も気になるが、追いにくい....)

投稿2021/10/15 12:30

pepperleaf

総合スコア6383

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

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

0

mainで宣言しているtagが初期化されてない。

tagは何だと思っているのでしょうか?

投稿2021/10/15 12:15

otn

総合スコア84857

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

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

otn

2021/10/15 12:22

簡単に直すには、2次元配列にすればいいかと思います。
angel_p_57

2021/10/15 12:24

> tagは何だと思っているのでしょうか? funcで各要素にアドレス値を格納する想定なのだから初期化は要らないでしょう。
otn

2021/10/15 12:41

tag[0] =c_buf; を見落としてました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.45%

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

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

質問する

関連した質問