int htoi(char s[]) {
int c;
int sum = 0;
int counter = 0;
for (int i = sizeof(s)/sizeof(s[0]) - 2; (c = tolower(s[i])) >= 'a' && (c = tolower(s[i]) <= 'f'); i--) {
int temp = (int) pow(16, counter) * (c - 87);
sum += temp;
counter++;
}
return sum;
}
我用以下方法调用该方法
int main()
{
char s[] = "FFF";
printf("%d\n", htoi(s));
}
我刚刚开始学习C。我正在尝试创建一种将十六进制转换为十进制的方法,但是以下代码不起作用。它在我的终端上输出-87,我不确定为什么。
编辑:刚刚意识到我的代码没有考虑实际数字,但是当我输入“ FFF”作为输入数组时,这两种方式都不起作用。
答案 0 :(得分:2)
代码有麻烦:
它错误地使用sizeof(s)
来查找“数组” char s[]
的大小,但是s
是一个指针。调用代码的s
是一个数组,但是当用作函数参数时,它会转换为第一个元素(指针)的地址。特别是,char s[]
是用作函数参数的指针。
它将c
分配给比较c = tolower(s[i]) <= 'f'
的结果,而不是小写的值。 @MikeCAT
它不处理'0' - '9'
。
相反,只需简单地遍历s
所指向的字符串,从第一个(最高有效数字)到最后一个(最低)。
int htoi(const char *s) {
int sum = 0;
while (isxdigit((unsigned char) *s)) {
int digit_value;
int char_value = (unsigned char) *s++; // Get unsigned value and advance s
if (isdigit(char_value)) {
digit_value = *s - '0';
} else {
digit_value = tolower(char_value) - 'a' + 10;
}
sum = sum * 16 + digit_value;
}
return sum;
}
很少有代码需要一个 signed 十六进制值。考虑返回unsigned
类型。
unsigned htou(const char *s) {
unsigned sum = 0;
...