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

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

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

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

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

Q&A

解決済

Segmentation fault (core dumped)の解決方法を教えてください

bbiiq
bbiiq

総合スコア33

C

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

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

3回答

0グッド

0クリップ

1342閲覧

投稿2022/07/21 07:20

実現したいこと

C言語により、給料をそれぞれの金種に分けるというコードを書きました。
そして、実行すると以下のようなSegmentation fault (core dumped)というエラーが起きてしまいます。
問題の部分はInput_data関数の部分だと予想しています。

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

給料金種別計算機 入力する人数を指定してください(最大10人):1 1人目名前入力[半角100文字(全角50文字)以内、空白入力禁止]:山田 山田さんの給料入力[0以上100,000,000以下]:200000 Segmentation fault (core dumped)

該当のソースコード

C言語

1#include <stdio.h> 2 3int MONEY[] = { 4 10000, 5 5000, 6 1000, 7 500, 8 100, 9 50, 10 10, 11 5, 12 1 13}; 14 15static char *Money_Ord[] = { 16 "一万円", 17 "五千円", 18 "千円", 19 "五百円", 20 "百円", 21 "五十円", 22 "十円", 23 "五円", 24 "一円" 25}; 26 27typedef struct { 28 int A10000; 29 int B5000; 30 int C1000; 31 int D500; 32 int E100; 33 int F50; 34 int G10; 35 int H5; 36 int I1; 37}M_class; 38 39typedef struct { 40 char name[101]; 41 int salary_total; 42 M_class salary_class; 43}MEMBERS; 44 45void Input_data(MEMBERS *target , int *count){ 46 printf("\n入力する人数を指定してください(最大10人):"); 47 scanf("%d",count); 48 for(int i = 0 ; i < *count ; i++){ 49 printf("\n%d人目名前入力[半角100文字(全角50文字)以内、空白入力禁止]:",i+1); 50 scanf("%s",target[i].name); 51 printf("\n%sさんの給料入力[0以上100,000,000以下]:",target[i].name); 52 scanf("%d",target[i].salary_total); 53 } 54} 55 56void Calc_data(MEMBERS *target , int count){ 57 int salary,number,*denomiCount; 58 59 for(int i = 0 ; i < count ; i++){ 60 salary = target[i].salary_total; 61 denomiCount = &target[i].salary_class.A10000; 62 for(int j = 0 ; j < 8 ; j++){ 63 number = salary / MONEY[j]; 64 salary -= number * MONEY[j]; 65 *denomiCount = number; 66 denomiCount++; 67 } 68 *denomiCount = salary; 69 } 70} 71 72void Export_txtdata(MEMBERS *target , int count){ 73 74} 75 76void Export_dispdata(MEMBERS *target , int count){ 77 int SUM[9] = {0},*denomiCount; 78 printf("給料金種内訳明細書"); 79 printf("-----------------------\n"); 80 for(int i = 0 ; i < count ; i++ ){ 81 denomiCount = &target[i].salary_class.A10000; 82 printf("%d人目:%sさんの給料%d円の金種内訳\n" , i+1 , target[i].name , target[i].salary_total); 83 for(int j = 0 ; j < 9 ; j++){ 84 printf("%sは、 %d枚\n" , Money_Ord[j] , *denomiCount); 85 SUM[j] += *denomiCount; 86 denomiCount++; 87 } 88 } 89 printf("-----------------------\n"); 90 printf("-金種別累計枚数-\n"); 91 printf("-----------------------\n"); 92 for(int i = 0 ; i < 9 ; i++){ 93 printf("%sは、 %d枚\n" , Money_Ord[i] , SUM[i]); 94 } 95 printf("-----------------------\n"); 96} 97 98int main() 99{ 100 int decision = 1; //終了判定 101 int count; 102 MEMBERS target[10]; 103 printf("給料金種別計算機"); 104 do{ 105 Input_data(target , &count); 106 Calc_data(target , count); //データの計算 107 //Export_txtdata(target , count); //計算結果をテキストに出力 108 Export_dispdata(target , count); //計算結果を画面に出力 109 printf("別のデータを入力しますか?\n"); 110 printf("Yes(1),No(0):"); 111 scanf("%d",&decision); 112 }while(decision); 113}

試した事

mainの中のInput_data関数とCalc_data関数との間に文字を出力するコードを入れたのですが、出力されなかったので問題はInput_data関数の中だと思われます。

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

実行環境:「Online C Compiler」https://www.tutorialspoint.com/compile_c_online.php

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答3

0

ベストアンサー

Input_data関数の中の給料を入力する部分でアクセス例外が起きていますね。
scanf関数の第二引数以降は入力する変数のアドレスを入れなければなりません。
なので正しくは、

C

1scanf("%d",&target[i].salary_total);

補足ですが、この上の

C

1scanf("%s",target[i].name);

はnameがchar型の配列なのでname単体だと配列の頭のアドレスを意味するため意図通りの動きをします。

投稿2022/07/21 07:42

ALOHAMS

総合スコア179

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

bbiiq

2022/07/21 07:47

詳細に回答していただきありがとうございます。

0

scanf("%d",target[i].salary_total);

正しくは scanf("%d",&target[i].salary_total); ではないかな?

投稿2022/07/21 07:32

episteme

総合スコア16009

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

bbiiq

2022/07/21 07:47

回答していただきありがとうございました。

0

c

1 scanf("%d",target[i].salary_total);

target[i].salary_total&target[i].salary_total でしょう。

まともなコンパイラならここで警告が出るはずなので、 Online C Compiler とやらは使わないほうがよいかもしれません。

投稿2022/07/21 07:28

int32_t

総合スコア17276

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

episteme

2022/07/21 07:34

可変長引数の関数は引数の型チェックが行われないのでコンパイラの警告をアテにするのも危険かと...
bbiiq

2022/07/21 07:48

回答していただきありがとうございます。 別のエディタを探してみます。 ありがとうございます。

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C

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

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。