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

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

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

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

コンパイルエラー

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

Q&A

解決済

3回答

2930閲覧

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

bbiiq

総合スコア51

C

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

コンパイルエラー

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

0グッド

0クリップ

投稿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

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

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

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

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

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

guest

回答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

総合スコア195

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

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

bbiiq

2022/07/21 07:47

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

0

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

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

投稿2022/07/21 07:32

episteme

総合スコア16614

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

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

bbiiq

2022/07/21 07:47

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

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

総合スコア20672

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

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

episteme

2022/07/21 07:34

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

2022/07/21 07:48

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問