我正在编写此代码以将十六进制条目转换为其等效的整数。所以A将是10而B将是11等。这个代码很奇怪,因为它是seg。随机位置的故障,包括额外的换行符,有时会使它工作。我正在尝试调试它,这样我才能理解我在这里做错了什么。任何人都可以看看并帮助我吗?非常感谢你的时间。
/ *修正了任何感兴趣的人的工作代码* /
#include <stdio.h>
#include <stdlib.h>
unsigned int hextoint(const char temp[])
{
int i;
int answer = 0;
int dec;
char hexchar[] = "aAbBcCdDeEfF" ;
for ( i=0; temp[i] != '\0'; i++ )
{
if ( temp[i] == '\0')
{
return ;
}
if (temp[i] == '0' || temp[i] == 'x' || temp[i] == 'X' )
{
printf("0");
answer = temp[i];
}
// compare each temp[i] with all contents in hexchar[]
int j;
int a = temp[i];
for ( j=0; hexchar[j] != '\0'; j++)
{
if ( temp[i] == hexchar[j] )
{
answer *= 16;
answer = answer + 10 + (j/2);
// printf("%d\n",answer );
break;
}
}
}
return answer;
}
main()
{
char *test[] =
{ "bad",
"aabbdd"
"0100",
"0x1",
"0XA",
"0X0C0BE",
"abcdef",
"123456",
"0x123456",
"deadbeef",
"zog_c"
};
int answer=0;
// Calculate the number of char's.
int numberOfChars;
numberOfChars = sizeof test /sizeof test[0];
printf("main():Number of chars = %d\n",numberOfChars);
int i;
// Go through each character and convert Hex to Integers.
for ( i = 0; i<numberOfChars;i++)
{
// Need to take the first char and then go through it and convert
it.
answer = hextoint(test[i]);
printf("%d\n",answer );
}
}
答案 0 :(得分:2)
我们来看看。
unsigned int hextoint(const char temp[])
{
int i;
int answer = 0;
char hexchar[] = "aAbBcCdDeEfF" ;
for ( i=0; temp[i] != '\0'; i++ )
{
printf("In here");
printf("%c\t",temp[i] );
}
return answer;
}
这似乎甚至没有尝试进行任何转换。它应始终返回0,因为永远不会为answer
分配任何其他值。通常,你会做类似的事情:
for (i=0; input[i] != '\0'; i++) {
answer *= 16;
answer += digit_value(input[i]);
}
return answer;
digit_value
(显然足够)返回单个数字的值。一种方法是:
int digit_value(char input) {
input = tolower(input);
if (input >= '0' && input <= '9')
return input - '0';
if (input >= 'a' && input <= 'f')
return input - 'a' + 10;
return -1; // signal error.
}
然后,看main
:
main()
{
取决于“隐含int”规则通常是不好的做法,至少是IMO。指定返回类型要好得多。
// Calculate the number of char's.
int numberOfChars;
numberOfChars = sizeof test /sizeof test[0];
这实际上是计算字符串的数量,而不是char
的数量。
for ( i = 0; i<=numberOfChars;i++)
有效的下标从0到项目数为1,所以这会尝试读取数组的末尾(给出未定义的行为)。
答案 1 :(得分:2)
这对于unsigned int范围内的任何数字都有效,好处是它不使用任何其他库函数,因此它非常适合空间紧张的微控制器。
unsigned int hexToInt(const char *hex)
{
unsigned int result = 0;
while (*hex)
{
if (*hex > 47 && *hex < 58)
result += (*hex - 48);
else if (*hex > 64 && *hex < 71)
result += (*hex - 55);
else if (*hex > 96 && *hex < 103)
result += (*hex - 87);
if (*++hex)
result <<= 4;
}
return result;
}
答案 2 :(得分:0)
问题在于计算numberOfChars
部分。 sizeof test
实际上是指针的大小,而不是数组中所有字符的总长度,因此代码中返回的数字将为1,这使得for循环转到第二个测试索引({{ 1}})最后没有test[1]
。尝试使用\0
计算strlen
。
答案 3 :(得分:0)
这可能不是最理想的方法,但它应该可以正常工作。
unsigned int hex_to_int(const char* hex) {
unsigned int result = 0;
size_t len = strlen(hex);
for (size_t i = 0; i < len; ++i) {
char cur_char = tolower(hex[len - i - 1]);
// direct return if encounter any non-hex character.
if (!(isdigit(cur_char) && (cur_char >= 'a' && cur_char <= 'f'));)
return result;
unsigned int char_val = (isdigit(cur_char) ? cur_char - '0' : 10 + cur_char - 'a');
result += round(pow(16, i)) * char_val;
}
return result;
}