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

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

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

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

Q&A

解決済

4回答

428閲覧

zsh: segmentation fault が表示されるのですが、原因がわかりません

OzRum

総合スコア3

C

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

0グッド

1クリップ

投稿2022/08/22 13:30

○×問題を作成しているのですが、12問目で「1」を入力すると zsh: segmentation fault がでます。
プログラミングは以下の通りで、問題の文章、正解の時のif(ans==___)のアンダーバーの部分が異なります。
文字数の都合で一部のプログラミングは削除してます。

#include "stdio.h"
int main(void)
{
int tr=0,failed=0,ans,t,f[failed];
float par;
printf("いまから表示される問題は、文章のみによる○×問題です。\n文章が正解だと思う場合には「0」,間違いだと思う場合には「1」を入力してください。\nなお、一度回答したものは、訂正はできないので、きちんと考えてから回答しましょう\n\n\n");
printf("第1問\n チャイルドシートを正しく着用していれば、事故にあったときに負傷が軽減される。\n ○か×か?(○は0,×は1を入力)\n");
scanf("%d",&ans);
if (ans==0)
{
tr += 1;
} else {
failed += 1;
f[failed] = 1;
}
printf("第2問\n 制限速度内であれば、急発進、急ブレーキ等をしても良い。\n ○か×か?(○は0,×は1を入力)\n");
scanf("%d",&ans);
if (ans==1)
{
tr += 1;
} else {
failed += 1;
f[failed] = 2;
}
printf("第3問\n 事故を起こした運転者は、刑事上の責任は負うが、民事上の責任は保険会社が負う。\n ○か×か?(○は0,×は1を入力)\n");
scanf("%d",&ans);
if (ans==1)
{
tr += 1;
} else {
failed += 1;
f[failed] = 3;
}
printf("第4問\n 車を運転するときは、動きやすい服装を着る。\n ○か×か?(○は0,×は1を入力)\n");
scanf("%d",&ans);
if (ans==1)
{
tr += 1;
} else {
failed += 1;
f[failed] = 4;
}
printf("第5問\n 二輪車は道が渋滞しているときは、路側帯を通行しても良い。\n ○か×か?(○は0,×は1を入力)\n");
scanf("%d",&ans);
if (ans==1)
{
tr += 1;
f[failed] = 5;
} else {
failed += 1;
}
printf("第6問\n 道路上で、酒によってふらついたり、立ち話をしたり、座ったり、寝そべったりなどしてはいけない。\n ○か×か?(○は0,×は1を入力)\n");
scanf("%d",&ans);
if (ans==0)
{
tr += 1;
} else {
failed += 1;
f[failed] = 6;
}
printf("第7問\n 運転中、サラリーマンが、会社に用事ができたので携帯電話を使用して運転した。\n ○か×か?(○は0,×は1を入力)\n");
scanf("%d",&ans);
if (ans==1)
{
tr += 1;
} else {
failed += 1;
f[failed] = 7;
}
printf("第8問\n 信号機は青信号の交差点で、警察が止まれをしていたが、無視して左折した。\n ○か×か?(○は0,×は1を入力)\n");
scanf("%d",&ans);
if (ans==1)
{
tr += 1;
} else {
failed += 1;
f[failed] = 8;
}
printf("第9問\n 手の合図で、窓から右手を水平に出しているときは、停止か徐行の合図である。\n ○か×か?(○は0,×は1を入力)\n");
scanf("%d",&ans);
if (ans==1)
{
tr += 1;
} else {
failed += 1;
f[failed] = 9;
}
printf("第10問\n 歩行者、自転車専用の信号が青になったら、自転車も一緒に信号に従う。\n ○か×か?(○は0,×は1を入力)\n");
scanf("%d",&ans);
if (ans==0)
{
tr += 1;
} else {
failed += 1;
f[failed] = 10;
}
printf("第11問\n 交差点とその手前30m以内は、自動車や原動付き自転車を追い越してはいけない。\n ○か×か?(○は0,×は1を入力)\n");
scanf("%d",&ans);
if (ans==0)
{
tr += 1;
} else {
failed += 1;
f[failed] = 11;
}
printf("第12問\n 一方通行で交差点付近を走行中、後方より緊急自動車が来たときは、交差点をさけて左側に寄って停止した。\n ○か×か?(○は0,×は1を入力)\n");
scanf("%d",&ans);
if (ans==0)
{
tr += 1;
} else {
failed += 1;
f[failed] = 12;
}
printf("第13問\n オートマチック車で後退するときは、後ろを確認して、シフトをリバース(R)に入れて、\nハンドブレーキを話し、フットブレーキを徐々に離して、確認しながら静かにアクセルを踏む。\n ○か×か?(○は0,×は1を入力)\n");
scanf("%d",&ans);
if (ans==0)
{
tr += 1;
} else {
failed += 1;
f[failed] = 13;
}
printf("第14問\n 同一方向に3車線の通行隊があるときは、最も右側の車両通行帯は追い越し等のためにあけておき、\n他の車線は速度の速い遅いに関わらず、どちらでも通行して良い。\n ○か×か?(○は0,×は1を入力)\n");
scanf("%d",&ans);
if (ans==1)
{
tr += 1;
} else {
failed += 1;
f[failed] = 14;
}
printf("第15問\n 信号機で交通整理が行われている見通しの悪い交差点で、信号機は青信号だったので、徐行しないで通過した。\n ○か×か?(○は0,×は1を入力)\n");
scanf("%d",&ans);
if (ans==0)
{
tr += 1;
} else {
failed += 1;
f[failed] = 15;
}
printf("第16問\n 進行方向が渋滞していたので、やむを得ず、横断歩道、自転車横断隊に停止した。\n ○か×か?(○は0,×は1を入力)\n");
scanf("%d",&ans);
if (ans==1)
{
tr += 1;
} else {
failed += 1;
f[failed] = 16;
}
printf("第17問\n 路面電車の停留所を通るとき、乗り降りする人がいたが、安全地帯があったので、徐行して通過した。\n ○か×か?(○は0,×は1を入力)\n");
scanf("%d",&ans);
if (ans==0)
{
tr += 1;
} else {
failed += 1;
f[failed] = 17;
}
printf("第18問\n 車から、空き缶は捨ててはいけないが、吸いがらや紙屑は捨てて良い。\n ○か×か?(○は0,×は1を入力)\n");
scanf("%d",&ans);
if (ans==1)
{
tr += 1;
} else {
failed += 1;
f[failed] = 18;
}
printf("第19問\n 後退合図は、3秒前にする。\n ○か×か?(○は0,×は1を入力)\n");
scanf("%d",&ans);
if (ans==1)
{
tr += 1;
} else {
failed += 1;
f[failed] = 19;
}

printf("第36問\n 道路が濡れていると、滑りやすくなるので、停止距離は長くなる。\n ○か×か?(○は0,×は1を入力)\n"); scanf("%d",&ans); if (ans==0) { tr += 1; } else { failed += 1; f[failed] = 36; } printf("第37問\n オートマチック車は、下り坂を走行するときには、燃費を良くするためにシフトを\nニュートラル(N)に入れて、フットブレーキを使って走行する。\n ○か×か?(○は0,×は1を入力)\n"); scanf("%d",&ans); if (ans==1) { tr += 1; } else { failed += 1; f[failed] = 38; } printf("第38問\n オートマチック車で、下り坂でエンジンブレーキを使うときはギアをS(2)に入れて、さらに強力なエンジンブレーキを効かすときは、L(1)に入れて下る。\n ○か×か?(○は0,×は1を入力)\n"); scanf("%d",&ans); if (ans==0) { tr += 1; } else { failed += 1; f[failed] = 39; } printf("第39問\n 横断歩道の手前に停止している車の横を通過するときは、飛び出しがないか徐行して運転する。\n ○か×か?(○は0,×は1を入力)\n"); scanf("%d",&ans); if (ans==1) { tr += 1; } else { failed += 1; f[failed] = 40; } printf("第40問\n 初心者マークのついている車や仮免許練習中の標識をつけている運転者が運転が上手くなるように、幅寄せや割り込みをしても良い。\n ○か×か?(○は0,×は1を入力)\n"); scanf("%d",&ans); if (ans==1) { tr += 1; } else { failed += 1; f[failed] = 41; } printf("第41問\n 集団で運転するときは、連絡を取り合うために、並進走行をしても良い。\n ○か×か?(○は0,×は1を入力)\n"); scanf("%d",&ans); if (ans==1) { tr += 1; } else { failed += 1; f[failed] = 41; } printf("第42問\n 車を進路変更するときは、ハンドルを切りながら方向指示器を出す。\n ○か×か?(○は0,×は1を入力)\n"); scanf("%d",&ans); if (ans==1) { tr += 1; } else { failed += 1; f[failed] = 42; } printf("第43問\n 道路外の施設に入るとき、歩行者が明らかにいないときは、一時停止しないで徐行する。\n ○か×か?(○は0,×は1を入力)\n"); scanf("%d",&ans); if (ans==1) { tr += 1; } else { failed += 1; f[failed] = 43; } printf("第44問\n 大型免許を受験する条件は、普通免許を取得して、3年経過していれば、年齢制限はない。\n ○か×か?(○は0,×は1を入力)\n"); scanf("%d",&ans); if (ans==1) { tr += 1; } else { failed += 1; f[failed] = 44; } printf("第45問\n オートマチック車で、エアコンを使用している時、エンジン始動時は、エンジンの回転数が高回転に設定してあるので急発進しやすい。\n ○か×か?(○は0,×は1を入力)\n"); scanf("%d",&ans); if (ans==0) { tr += 1; } else { failed += 1; f[failed] = 45; } printf("第46問\n 自動車損害賠償責任保険又は責任共済証明書は、車に備えておく。\n ○か×か?(○は0,×は1を入力)\n"); scanf("%d",&ans); if (ans==0) { tr += 1; } else { failed += 1; f[failed] = 46; } printf("第47問\n 大人と子供がを繋いでいる標識では、自転車も走行できる:1。\n ○か×か?(○は0,×は1を入力)\n"); scanf("%d",&ans); if (ans==1) { tr += 1; } else { failed += 1; f[failed] = 47; } printf("第48問\n 山から小さいものが降ってきている標識は落石注意の標識である:0。\n ○か×か?(○は0,×は1を入力)\n"); scanf("%d",&ans); if (ans==0) { tr += 1; } else { failed += 1; f[failed] = 48; } printf("第49問\n 黄色い中央線をはみ出してはいけない。\n ○か×か?(○は0,×は1を入力)\n"); scanf("%d",&ans); if (ans==0) { tr += 1; } else { failed += 1; f[failed] = 49; } printf("第50問\n 手を上げている警察官に対面する交通は、赤信号である。\n ○か×か?(○は0,×は1を入力)\n"); scanf("%d",&ans); if (ans==0) { tr += 1; } else { failed += 1; f[failed] = 50; } par = (tr*100)/50 ; printf("正解数%d\n 誤数%d\n正答率:%3.2f\n間違えた問題は",tr,failed,par); for (t=1; t<failed; t++) { printf("第%d問\n",f[failed]); } return 0;

}

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

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

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

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

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

jimbe

2022/08/23 07:08

コードはマークダウン記法をご利用ください。 マークダウンに付きましてはヘルプを参照してください。
guest

回答4

0

ベストアンサー

c

1int tr=0,failed=0,ans,t,f[failed];

配列 f のサイズが0として宣言されているので、範囲外アクセスを起こしています。全問不正解になる可能性があるので、f[50] は必要でしょう。

投稿2022/08/22 22:33

int32_t

総合スコア20941

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

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

0

配列の宣言では、正しい要素数を指定しましょう。

同じことを何度も書くのは馬鹿げています。
配列と for文を使えば、同じことを何度も書かずに済みます。

C

1#include <stdio.h> 2 3#define N 10 // 50 4 5const char *question[N] = { 6 "第1問\n チャイルドシートを正しく着用していれば、事故にあったときに負傷が軽減される。", 7 "第2問\n 制限速度内であれば、急発進、急ブレーキ等をしても良い。", 8 "第3問\n 事故を起こした運転者は、刑事上の責任は負うが、民事上の責任は保険会社が負う。", 9 "第4問\n 車を運転するときは、動きやすい服装を着る。", 10 "第5問\n 二輪車は道が渋滞しているときは、路側帯を通行しても良い。", 11 /* ... */ 12 "第46問\n 自動車損害賠償責任保険又は責任共済証明書は、車に備えておく。", 13 "第47問\n 大人と子供がを繋いでいる標識では、自転車も走行できる:1。", 14 "第48問\n 山から小さいものが降ってきている標識は落石注意の標識である:0。", 15 "第49問\n 黄色い中央線をはみ出してはいけない。", 16 "第50問\n 手を上げている警察官に対面する交通は、赤信号である。", 17}; 18 19int answer[N] = { 20 0, 1, 1, 1, 1, /* ... */ 0, 1, 0, 0, 0 21}; 22 23int main(void) 24{ 25 int tr = 0, failed = 0, ans, f[N]; 26 printf("いまから表示される問題は、文章のみによる○×問題です。\n" 27 "文章が正解だと思う場合には「0」,間違いだと思う場合には「1」を入力してください。\n" 28 "なお、一度回答したものは、訂正はできないので、きちんと考えてから回答しましょう\n\n"); 29 for (int i = 0; i < N; i++) { 30 printf("%s\n ○か×か?(○は0,×は1を入力)\n", question[i]); 31 scanf("%d", &ans); 32 if (ans == answer[i]) 33 tr++; 34 else 35 f[failed++] = i+1; 36 } 37 double par = (tr * 100) / N; 38 printf("正解数%d\n誤数%d\n正答率:%3.2f\n間違えた問題は\n", 39 tr, failed, par); 40 for (int i = 0; i < failed; i++) 41 printf(" 第%d問\n", f[i]); 42 return 0; 43}

コードの投稿のやり方は terateil のヘルプをよく読んでください。

投稿2022/08/23 02:02

kazuma-s

総合スコア8224

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

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

0

本題ではありませんが、
「プログラミング」というのはプログラムを作成する行為のことです。

プログラミングは以下の通り

というと「プログラムを作る行為は以下の通り」ということで、日本語?レベルでとても違和感があります。「プログラムは以下の通り」というところではないでしょうか。

さて、プログラム冒頭
int tr=0,failed=0,ans,t,f[failed];
内容を理解して書いていますか? あるいは「配列」についての勉強が足りていないのかも知れません。
faildを宣言し0で初期化しています。そして、そのfaildつまり0を要素数としてf[failed]を宣言しています。
fの要素数は0となり、値を格納することはできません。そもそも動くはずが無いプログラムなのですが、Cはなんのチェックもしないので、逆に11問目までは「たまたま動いているように見えた」というところでしょう。
(なお、変数を要素数とする「可変長配列」は、現行のC規格ではオプション扱いなので、使用できないコンパイラもあることには留意すべきと思います)

原因がわかりません

という質問なので、敢えて解決までは提示しません。また、それ以外に間違いがあるかどうかなどは一切調べていません。

投稿2022/08/22 22:40

thkana

総合スコア7652

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

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

0

端折った部分のプログラミングです

printf("第20問\n 交差点で右折するときに、直進車や左折車、路面電車の進行を妨げてはいけない。\n ○か×か?(○は0,×は1を入力)\n");
scanf("%d",&ans);
if (ans==0)
{
tr += 1;
} else {
failed += 1;
f[failed] = 20;
}
printf("第21問\n 今から運転する人に、少量のお酒でもすすめてはいけない。\n ○か×か?(○は0,×は1を入力)\n");
scanf("%d",&ans);
if (ans==0)
{
tr += 1;
} else {
failed += 1;
f[failed] = 21;
}
printf("第22問\n 初心者マークは、免許証を取得して1年未満の人は付けるようになっているが、他人の車を運転するときにはつけなくて良い。\n ○か×か?(○は0,×は1を入力)\n");
scanf("%d",&ans);
if (ans==1)
{
tr += 1;
} else {
failed += 1;
f[failed] = 22;
}
printf("第23問\n 車と歩行者通行禁止の標識:1。\n ○か×か?(○は0,×は1を入力)\n");
scanf("%d",&ans);
if (ans==1)
{
tr += 1;
} else {
failed += 1;
f[failed] = 23;
}
printf("第24問\n 急な下り坂があることを示す標識:0。\n ○か×か?(○は0,×は1を入力)\n");
scanf("%d",&ans);
if (ans==0)
{
tr += 1;
} else {
failed += 1;
f[failed] = 24;
}
printf("第25問\n 腕を広げている警察官に対して平行は道路の信号は青信号:0。\n ○か×か?(○は0,×は1を入力)\n");
scanf("%d",&ans);
if (ans==0)
{
tr += 1;
} else {
failed += 1;
f[failed] = 25;
}
printf("第26問\n 信号機で交通整理の行われている交差点で、信号機は青信号だったが、渋滞していたので停止線に停止して待った。\n ○か×か?(○は0,×は1を入力)\n");
scanf("%d",&ans);
if (ans==0)
{
tr += 1;
} else {
failed += 1;
f[failed] = 26;
}
printf("第27問\n シートベルトが後部座席に着いていたので、着用させた。\n ○か×か?(○は0,×は1を入力)\n");
scanf("%d",&ans);
if (ans==0)
{
tr += 1;
} else {
failed += 1;
f[failed] = 27;
}
printf("第28問\n 友人と酒を飲んで、自分は免許を持っていなかったので、友人に家まで送ってもらった。\n ○か×か?(○は0,×は1を入力)\n");
scanf("%d",&ans);
if (ans==1)
{
tr += 1;
} else {
failed += 1;
f[failed] = 28;
}
printf("第29問\n 車両通行帯があるところは、通行帯をまたがって通行してはいけない。\n ○か×か?(○は0,×は1を入力)\n");
scanf("%d",&ans);
if (ans==0)
{
tr += 1;
} else {
failed += 1;
f[failed] = 29;
}
printf("第30問\n 歩道や路側帯のない道路で、0.5mは路肩なので、通行してはいけない。\n ○か×か?(○は0,×は1を入力)\n");
scanf("%d",&ans);
if (ans==0)
{
tr += 1;
} else {
failed += 1;
f[failed] = 30;
}
printf("第31問\n 信号機で交通整理の行われてない道幅の同じ交差点では、路面電車は全ての車に優先する。\n ○か×か?(○は0,×は1を入力)\n");
scanf("%d",&ans);
if (ans==1)
{
tr += 1;
} else {
failed += 1;
f[failed] = 31;
}
printf("第32問\n 交差点を走行中に、後方より緊急自動車が来たので、交差点で停止した。\n ○か×か?(○は0,×は1を入力)\n");
scanf("%d",&ans);
if (ans==1)
{
tr += 1;
} else {
failed += 1;
f[failed] = 32;
}
printf("第33問\n 方向指示器をつけたままで走行すると、他の車に迷惑になるので、付けたままで走行してはいけない。\n ○か×か?(○は0,×は1を入力)\n");
scanf("%d",&ans);
if (ans==0)
{
tr += 1;
} else {
failed += 1;
f[failed] = 33;
}
printf("第34問\n 踏切を通過するときは、発信してすぐに高速ギアに入れて通過する。\n ○か×か?(○は0,×は1を入力)\n");
scanf("%d",&ans);
if (ans==1)
{
tr += 1;
} else {
failed += 1;
f[failed] = 34;
}
printf("第35問\n 危険を感じてブレーキを踏んで、ブレーキが効き始めてから止まるまでが、停止距離である。\n ○か×か?(○は0,×は1を入力)\n");
scanf("%d",&ans);
if (ans==1)
{
tr += 1;
} else {
failed += 1;
f[failed] = 35;
}

投稿2022/08/22 13:30

OzRum

総合スコア3

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

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

jimbe

2022/08/23 07:07

回答に質問の一部を載せないでください。 質問に載せきれないのであれば、ネットのストレージを利用する等が適当と思います。
OzRum

2022/08/23 08:38

そちらも検討したのですが、私が使っているクライドでは個人情報が載ってしまう可能性もあったので今回はそのまま載せました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問