我正在尝试运行示例代码以将十进制数数组转换为六进制数并将它们存储在另一个数组中。如果我扫描数字,代码就可以工作,但是在使用数组时,我遇到了分段错误。
#include <stdio.h>
int main(void)
{
int bin = 0;
// int num ;
int i = 0, rem;
char hex_arr[60];
//printf("Enter a decimal number: ");
//scanf("%d", &num);
int num [60] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 128, 31, 239, 31, 254, 1, 255, 240, 0, 0, 0, 0, 127, 255, 192, 255, 255, 255, 128, 127, 231, 192, 120, 14, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
for (int k = 0; k <= 59; i++)
{
rem = num[k] % 16; // get the right most digit
if (rem < 10)
{
hex_arr[i++] = 48 + rem;
}
else
{
hex_arr[i++] = 55 + rem;
}
num[k] /= 16; // get the quotient
}
printf("0x");
for(int j = i - 1; j >= 0 ; j--) // print the hex_arr in reverse order
{
printf("%c", hex_arr[j]);
}
return 0;
}
答案 0 :(得分:1)
你需要摆脱所有的“幻数”。
k <= 59
-> k < 60
48 + rem
-> '0' + rem
55 + rem
-> '7' + rem
。等等,'7'
有什么意义?事实证明它没有,并且使用“魔术数字”隐藏了该错误。您可能指的是 65,应该写为 'A'
。
(严格来说,使用符号值的算术在 C 中没有明确定义,因为实际上只有符号 '0'
到 '9'
被保证是一个连续的序列。在实践中“它会工作" 在所有主流系统上。)
如评论中所述,for (int k=0; ...; i++)
可能也没有任何意义。
答案 1 :(得分:1)
这有帮助吗
注意事项
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include <stdio.h>
void ByteToASCII (char * string, unsigned char byte )
{
char curval ;
curval = (char) ('0' | (byte >> 4)) ;
if ('9' < curval)
{
curval += (char) ('A' - '9' - 1) ;
}
*string++ = curval ;
byte <<= 4 ;
curval = (char) ('0' | (byte >> 4)) ;
if ('9' < curval)
{
curval += (char) ('A' - '9' - 1) ;
}
*string++ = curval ;
*string = 0 ; // keep null terminated
}
int main(void)
{
//printf("Enter a decimal number: ");
//scanf("%d", &num);
unsigned char num [60] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 128, 31, 239, 31, 254, 1, 255, 240, 0, 0, 0, 0, 127, 255, 192, 255, 255, 255, 128, 127, 231, 192, 120, 14, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
char hex_arr[(2 * sizeof(num)) + 1];
for (int k = 0; k < sizeof(num); k++)
{
ByteToASCII (&hex_arr[k * 2], num[k]) ;
}
printf(hex_arr);
return 0;
}