みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

独学で最近c言語を始めたものです。10進数を16進数に変換するプログラ

独学で最近c言語を始めたものです。10進数を16進数に変換するプログラムを作りました。
しかしコンパイルしてもエラーは出ないのですがprintfの部分で配列の結果のみが出ません。
如何せん、独学ですので気付かないところで簡単なミスをしているかもしれませんが、分かる方がいましたご教授ください。
#include<stdio.h>
int main()
{
static char data[16]=
{'1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
char hex[5];
short dec,num,i;

for(;;){
for(i=0;i<=3;i++)
hex[i]=' ';
hex[4]='\0';
printf("10進数を入力してください。>>");
scanf("%d",&dec);
if(dec==0)
break;
for(i=3;dec!=0;i--){
num=dec%16;
dec/=16;
hex[i]=data[num];
}
printf("16進数は%sです\n",hex);
}

}

投稿日時 - 2010-07-17 01:36:24

QNo.6043788

困ってます

質問者が選んだベストアンサー

data[16]に'0'がありません。
decなどの型をshortにする理由がわかりません。数の大きさを制限したいなら、そのようなコードを付け加えた方がよいでしょう。
mainがintの戻り値をとるのでreturn 0で帰ってください。無限ループじゃない方がいいような気もします。実行を終了するのにbreakよりreturn 0の方がいいでしょう。
数値以外の数や、負数が入力されたときの対応なども考えた方がいいでしょう。
全体としては特に問題なく動くようです。

下記で、どうでしょう。

#include<stdio.h>
int main()
{
static char data[16]=
{'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
char hex[5];
int dec,num,i;

for(;;){
for(i=0;i<=3;i++){
hex[i]=' ';
hex[4]='\0';
}
printf("10進数を入力してください(32767より小さい数)。>>");
scanf("%d",&dec);
if(dec>32767) return 0;
if(dec<=0) return 0;
for(i=3;dec!=0;i--){
num=dec%16;
dec/=16;
hex[i]=data[num];
}
printf("16進数は%sです\n",hex);
}
return 0;
}

投稿日時 - 2010-07-17 03:15:55

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

> scanf("%d",&dec);
scanf系の関数のフォーマット文字列と、引数の型は一致させるようにしましょう。
decがshortでも %d は intの分だけ書き込みます。shortで足りない分は、他の領域に書き込まれてしまいます。
shortを使うなら%hdとshortに対応した書式に、%dを使うなら、decはint型にしましょう。
詳しくは、scanfのマニュアルの書式のところを参考にしてください。

それから、scanfは扱いの難しい関数です。(例えば、いきなり数字じゃない文字を入れたらどうなると思いますか?)
戻り値はチェックした方がよいです。

投稿日時 - 2010-07-17 07:59:06

お礼

お二方ともありがとうございます。short→int でreturn 0;で無事解決しました!!
ありがとうございました! 

投稿日時 - 2010-07-20 00:23:13

あなたにオススメの質問