2016年7月19日 星期二

10轉16進制

10轉16進制
http://forum.slime.com.tw/thread277654.html
#include<stdio.h>
#include<stdlib.h>


int main(void){
   int num,i,j,x;
   char s[999];
   //char str[999]; 這是多餘的
// while(scanf("%d",&num)!=EOF) 這行 scanf 沒有輸入提示,會搞到後面很難除錯
 while(1)
   {
    printf("\nInput DEC Number: "); // 增加的輸入提示
    scanf("%d",&num)!=EOF;
    j=0; // 把最下面的 j=0; 移上來比較容易了解作用: s 字串陣列 index 歸零  
    while (num!=0)
      {
       i=num%16; // 取餘數
       switch(i)
         {
          case 10:
            s[j]='a';
          break;
         
          case 11:
           s[j]='b';
          break;
         
          case 12:
            s[j]='c';
          break;
         
          case 13:
            s[j]='d';
          break;
         
          case 14:
            s[j]='e';
          break;  
         
          case 15:
            s[j]='f';
          break;
         
          default:
              // s[j]=i; 資料格式錯誤,必須要把數值格式轉換成 "文字格式"。
               s[j]=48+i; // 這一行是以 ASCII 編碼直接做換算。
         }
       num=num/16; //取商數,下一回的被除數
       j+=1;
      }
       s[j]='\0'; // 以據 C/C++ 語言的字串特性,給予的字串結尾符號。
     
      // j-=1; 可以直接並到 接下來的 for loop 中。

   printf("Otput HEX Number:["); // 增加的輸出顯示  
   //for (i=j;i>=0;i--)
   //   { printf("%s",s[i]); } 這是錯的,要顯示出字元,要用 %c 不然會錯誤,編譯後出現錯誤當機應該也是這裡  
 
   for (i=j-1;i>=0;i--)
      { printf("%c",s[i]); }

   printf("]");     // 增加的輸出顯示
   // j=0; 這行正確的作法,應該是要移到在上面的地方,需要明確的讓 s[j] 一開始規零的地方。
   printf("\n");
   }

 return 0;  
}

沒有留言:

張貼留言