使用系統函數實現要加入#include <stdlib.h>,自己編寫則不需要這個頭文件。
下面的代碼就是3種方式的實現,包括2位的整數和任意整數(2的31次方以內)都可以。可自己選擇需要的實現方式。
利用系統函數有
1. char * itoa ( int value, char * str, int base );value是要轉化的數字,str是轉化後的字符串存儲的位置,base是進制數(但是這個函數不是標準C函數,有些編譯器是不支持的!)。所以代碼可以為:
1
2
3
4
5
6
7
char buffer [33]; //用於存放轉換好的十六進制字符串,可根據需要定義長度
char * inttohex(int aa)
{
itoa (aa, buffer, 16);
return (buffer);
}
2. sprintf(str,"%x",value);str是轉化存儲的位置,%x表示十六進制格式,value是要轉化的數字。所以代碼可以為:
1
2
3
4
5
6
7
char buffer [33]; //用於存放轉換好的十六進制字符串,可根據需要定義長度
char * inttohex(int aa)
{
sprintf(buffer, "%x", aa);
return (buffer);
}
3. 自己編寫
如果參數只要兩位數的整數,那麽很簡單。代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
char buffer [3]; //用於存放轉換好的十六進制字符串。由於只要支持2位整數,所以長度3即可
char * inttohex(int aa)
{
if (aa / 16 < 10) //計算十位,並轉換成字符
buffer[0] = aa / 16 + '0';
else
buffer[0] = aa / 16 - 10 + 'A';
if (aa % 16 < 10) //計算個位,並轉換成字符
buffer[1] = aa % 16 + '0';
else
buffer[1] = aa % 16 - 10 + 'A';
buffer[2] = '\0'; //字符串結束標誌
return (buffer);
}
如果參數是任意整數,由於計算方法是每次都除以16和對16取余數,余數以倒序的順序排列就是結果,所以最佳方法是用遞歸函數(當然循環也可以,但需要最後再進行倒序)。遞歸代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
char buffer [33]; //用於存放轉換好的十六進制字符串,可根據需要定義長度
char * inttohex(int aa)
{
static int i = 0;
if (aa < 16) //遞歸結束條件
{
if (aa < 10) //當前數轉換成字符放入字符串
buffer[i] = aa + '0';
else
buffer[i] = aa - 10 + 'A';
buffer[i+1] = '\0'; //字符串結束標誌
}
else
{
inttohex(aa / 16); //遞歸調用
i++; //字符串索引+1
aa %= 16; //計算當前值
if (aa < 10) //當前數轉換成字符放入字符串
buffer[i] = aa + '0';
else
buffer[i] = aa - 10 + 'A';
}
return (buffer);
}
最後測試代碼如下(以sprintf為例,其余只要替換inttohex函數中的代碼內容即可):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <stdlib.h>
char buffer [33]; //用於存放轉換好的十六進制字符串,可根據需要定義長度
char * inttohex(int aa)
{
sprintf(buffer, "%x", aa);
return (buffer);
}
int main ()
{
int num;
char * hex_str;
printf ("Enter a number: ");
scanf ("%d",&num);
hex_str = inttohex (num);
printf ("Hexadecimal number: %sH\n", hex_str);
return 0;