易语言16进制怎么转换成字符串
c语言十六进制转换八进制怎么转?
c语言十六进制转换八进制怎么转?
此题涉及到大数据处理(输入的16进制数最大可能到100000位),所以不能用常规的除8模8方法做,思路:
先将十六进制转为二进制表示
再将二进制转换为八进制表示,然后输出
具体程序实现如下:
#include ltstdio.hgt
#include ltstdlib.hgt
#include ltstring.hgt
/* 将十六进制字符转换为数值 */
int get_value(const char c)
{
if (c gt #390#39 ampamp c lt #399#39)
return c - #390#39
else
return c - #39A#39 10
}
int main()
{
char *input, *output, *output2, *ptr
int n, i, j, tmp, len
scanf(#34%d
#34, ampn)
input (char *)malloc(100000 1)/* 储存输入的十六进制数 */
output (char *)malloc(100000*4 4)/* 储存过度用的二进制数 */
output2 (char *)malloc(100000*3 3)/* 储存最终结果八进制数 */
while(n--)
{
gets(input)
len strlen(input)
ptr input
j0
/* 首先将十六进制转换为二进制,1位十六进制数对应4位二进制数 */
while(*ptr)
{
tmp get_value(*ptr)
output[j ] ((tmpgtgt3)amp0x1)/* bit3 */
output[j ] ((tmpgtgt2)amp0x1)/* bit2 */
output[j ] ((tmpgtgt1)amp0x1)/* bit1 */
output[j ] ((tmpgtgt0)amp0x1)/* bit0 */
ptr
}
/* 将二进制转换为八进制,3位二进制数对应1位八进制数,从低位开始转 */
/* j为二进制数组下标,每个循环减3 */
/* i为八进制数组下标,每个循环减1 */
jlen*4-1
i(len*4 2)/3 - 1
output2[i 1] #390#39
for(jgt0)
{
if(j gt 2)
output2[i--] (output[j-2]ltlt2 | output[j-1]ltlt1 | output[j]) #390#39
else if (j 1)
output2[i--] (output[j-1]ltlt1 | output[j]) #390#39
else if (j 0)
output2[i--] output[j] #390#39
j - 3
}
/* 八进制数组的有效下标从 i 1 开始 */
j i 1
/* 去除前导的#390#39字符(可能会影响判定结果) */
while(output2[j]#390#39) j
/* 如果整个字符串都是#390#39,则直接输出结果#390#39,否则从首位非#390#39开始输出 */
if( output2[j] #390#39)
printf(#340
#34)
else
printf(#34%s
#34, ampoutput2[j])
}
free(input)
free(output)
free(output2)
return 0
}
并且将转换的16进制数转成字符串(字符数组)?
sprintf 函数啊比如你写int n100char str1[10] {0}sprintf(str1,