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

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

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

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

Q&A

6回答

476閲覧

10進数を2進数に変換したい。(Segment faultが表示される)

KATANKUN-COCOA

総合スコア0

C

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

0グッド

0クリップ

投稿2022/05/12 08:58

初投稿のため少々の内容不足お許しください。

この度私は下記のソースコードを作成したのですが、何度実行しても「segment fault」と表示されて、思うような結果が出力されません。どのように修正すればきちんと動作するのでしょうか。

ソースコード↓(処理内容:10進数を2進数に変換する)

条件:0から9999まで

C言語

1コード 2#include <stdio.h> 3 4int main(void){ 5 int i,decimal,j; 6 int binary[14]; 7 8 printf("10進数を入力してください>>>"); 9 scanf("%d",&decimal); 10 11 while(decimal>0) 12 { 13 binary[i]=decimal%2; 14 decimal = decimal/2; 15 i++; 16 } 17 for(j=i;j>0;j--) 18 { 19 printf("%d ",binary[j]); 20 } 21 return 0; 22}

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

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

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

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

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

1T2R3M4

2022/05/12 09:05

int i, かな。
jimbe

2022/05/12 17:38

> 条件:0から9999まで 何の条件でしょう。
guest

回答6

0

int である decimal の中身は2進数です。
scanf("%d", &decimal); で10進文字列から 2進数への変換が行われています。
その 2進数の有効桁数を求めて、各ビットを表示すればよいということです。

c

1#include <stdio.h> 2 3int main(void) 4{ 5 int decimal, i = 0; 6 printf("10進数を入力してください>>>"); 7 scanf("%d", &decimal); 8 while (decimal >> ++i) ; 9 do putchar(decimal >> --i & 1 | '0'); while (i); 10}

追記
ビット演算ではなく、四則演算だけでやるとすれば、

c

1#include <stdio.h> 2 3int main(void) 4{ 5 int decimal, i = 2; 6 printf("10進数を入力してください>>>"); 7 scanf("%d", &decimal); 8 while (decimal / i) i *= 2; 9 i /= 2; 10 do putchar(decimal / i % 2 + '0'); while (i /= 2); 11}

投稿2022/05/12 21:04

編集2022/05/13 02:42
kazuma-s

総合スコア8224

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

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

0

ご質問の主題は既に回答されてますので、コードを弄ってみました。
2 で割って余りを求める方法では、下位桁から求まる為に一時保管場所が必要になり、ループが演算と表示の2回になります。
上位から求めれば即表示出来ますので一時保管場所が要らずループも1回で済みますが、 2 で割って…とはいかない為にビット演算で求めます。

c

1#include <stdio.h> 2int main(void) { 3 int decimal; 4 5 printf("10進数を入力してください>>>"); 6 scanf("%d", &decimal); 7 8 for(int i=13; i>=0; i--) { 9 if(decimal & (1 << i)) printf("1"); 10 else if((decimal >> i) || i == 0) printf("0"); 11 } 12 13 return 0; 14}

投稿2022/05/12 17:57

編集2022/05/12 18:11
jimbe

総合スコア12696

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

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

0

segment fault

ってのは、想定外の場所のメモリアクセスで発生します
で、この原因となってるのは、

binary[i]=decimal%2;

の行です。
ローカル変数(i)は、初期化しない限りでたらめな値を持ちます
そのiになにも代入しないでいきなりここで使用しているため、binary[i]が範囲外のアクセスとなってしまっています

投稿2022/05/12 10:42

y_waiwai

総合スコア87784

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

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

0

今回の質問内容とは直接的には関係無いかもしれませんが、

int binary[14];

配列binaryの要素数を14にしていますが、なぜ14にしているのでしょうか?

投稿2022/05/12 10:34

編集2022/05/12 10:37
shsh_

総合スコア113

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

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

0

以下のようにしてください。

C

1#include <stdio.h> 2 3int main(void){ 4 int i,decimal,j; 5 int binary[14]; 6 7 printf("10進数を入力してください>>>"); 8 scanf("%d",&decimal); 9 i = 0; //追加 10 while(decimal>=0) //修正 11 { 12 binary[i]=decimal%2; 13 decimal = decimal/2; 14 i++; 15 if (decimal == 0) break; //追加 16 } 17 for(j=i-1;j>=0;j--) //修正 18 { 19 printf("%d ",binary[j]); 20 } 21 return 0; 22} 23

do {
}while(条件)の形に書き換えると、以下のようになります。

C

1#include <stdio.h> 2 3int main(void){ 4 int i,decimal,j; 5 int binary[14]; 6 7 printf("10進数を入力してください>>>"); 8 scanf("%d",&decimal); 9 i = 0; 10 do { 11 binary[i]=decimal%2; 12 decimal = decimal/2; 13 i++; 14 }while(decimal>0); 15 for(j=i-1;j>=0;j--) 16 { 17 printf("%d ",binary[j]); 18 } 19 return 0; 20} 21

投稿2022/05/12 09:48

tatsu99

総合スコア5462

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

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

0

とりあえず i0 で初期化すれば segmentation fault は直るかと思います。
が、それ以外にも2つ目のループで何も書き込んでいない要素を読んでいたり、decimal が 0 のときにどうするかなどの問題がありますね。

投稿2022/05/12 09:26

int32_t

総合スコア20941

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

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

KATANKUN-COCOA

2022/05/12 09:39

早期のご回答ありがとうございます。 一つ質問があるのですが、「何も書き込んでいない要素」とは具体的になんのことなのでしょうか。 説明していただけると助かります。
int32_t

2022/05/12 09:49

たとえば、whileループで binary[0] から binary[3] まで書き込んだ場合、forループでは binary[4] から読み始めてます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問