dポイントプレゼントキャンペーン実施中!

独学で最近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);
}

}

A 回答 (2件)

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;
}
    • good
    • 0

> scanf("%d",&dec);


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

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

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

お礼日時:2010/07/20 00:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!