我正在尝试在
htoi
中编写一个 C
函数,读取十六进制数字流,包括前导 0x
或 0X
,并返回相应的数值。
有人可以帮我找出我的
htoi
功能出了什么问题吗?它似乎仅适用于十六进制的整数(0-9),不适用于“A”/“a”-“F”/“f”。我只是好奇我的代码有什么问题。
例如,在我输入“Ox777”时,我得到数字 1911,这是正确的,但是,如果我输入值“Ox7DF”,我会得到错误的数字值:它不处理字母,只处理数字字符。
#include<stdio.h>
#include<string.h>
#define YES 1
#define No 1
int htoi(char s[])
{
int i = 0;
if (s[i] == '0')
{
++i;
}
if (s[i] == 'x' || s[i] == 'X')
{
++i;
}
int n = 0;
int hexdigit;
for(; i < strlen(s); ++i )
if (s[i] >= '0' && s[i] <= '9'){
hexdigit = s[i] - '0';
n = 16 * n + hexdigit;
}
if (s[i] >= 'A' && s[i] <= 'F'){
hexdigit = s[i] - 'A' + 10;
n = 16 * n + hexdigit;
}
if (s[i] >= 'a' && s[i] <= 'f'){
hexdigit = s[i] - 'a' + 10;
n = 16 * n + hexdigit;
}
printf("%d", n);
return n;
}
int main()
{
char a[] = "0x71927";
htoi(a);
return 0;
}
在
for
语句之后缺少一组花括号!就目前而言,循环体仅以下代码:
if (s[i] >= '0' && s[i] <= '9') {
hexdigit = s[i] - '0';
n = 16 * n + hexdigit;
}
这是因为,如果在
{
语句之后没有 }
...for
分隔块 immediately,那么只有一个 单个语句 用于循环(并且这个“单个语句”是整个第一个
if
块)。在 {
行(或者在其后面的行上,如果您愿意)添加相关 for
以及相应的 }
after 您的第三个 if
块修复了代码:
for (; i < strlen(s); ++i) { // Note the added "{" - which 'starts' the loop's block!
if (s[i] >= '0' && s[i] <= '9') {
hexdigit = s[i] - '0';
n = 16 * n + hexdigit;
}
if (s[i] >= 'A' && s[i] <= 'F') {
hexdigit = s[i] - 'A' + 10;
n = 16 * n + hexdigit;
}
if (s[i] >= 'a' && s[i] <= 'f') {
hexdigit = s[i] - 'a' + 10;
n = 16 * n + hexdigit;
}
} // And this "}" closes the loop!
在您的代码中,没有对循环内的“A..F”和“a..f”字符进行测试,因此十六进制数字中的任何此类字符都将被忽略(视为零)。当执行两个后续 if
测试时,
s[i]
将指向字符串的 nul
终止符。hexdigit = s[i] - '0'; n = 16 * n + hexdigit;
for(; i < strlen(s); ++i ) {
if (s[i] >= '0' && s[i] <= '9'){
/*->*/ hexdigit = s[i] - '0';
/*->*/ n = 16 * n + hexdigit;
}
if (s[i] >= 'A' && s[i] <= 'F'){
/*->*/ hexdigit = s[i] - 'A' + 10;
/*->*/ n = 16 * n + hexdigit;
}
if (s[i] >= 'a' && s[i] <= 'f'){
/*->*/ hexdigit = s[i] - 'a' + 10;
/*->*/ n = 16 * n + hexdigit;
}
}
在这个结构中,不能这样做
// from ASCII 'a' = 97
hexdigit = (int) s[i]-86;
or
s[i] =(int) s[i] -86;
for(; i < strlen(s); ++i )
if (s[i] >= '0' && s[i] <= '9'){
hexdigit = s[i] - '0';
n = 16 * n + hexdigit;
} else if (s[i] >= 'A' && s[i] <= 'F'){
hexdigit = s[i] - 'A' + 10;
n = 16 * n + hexdigit;
} else if (s[i] >= 'a' && s[i] <= 'f'){
hexdigit = s[i] - 'a' + 10;
n = 16 * n + hexdigit;
}
int htoi(char s[]){
int val, i;
val = 0;
for(i = 0; s[i] != '\0'; i++){
if(s[i] >= '0' && s[i] <= '9'){
val = val * 16 + (s[i] - '0');
}
if(s[i] >= 'a' && s[i] <= 'f'){
val = val * 16 + (s[i] - 'a' + 10);
}
if(s[i] >= 'A' && s[i] <= 'F'){
val = val * 16 + ((s[i] - 'A' + 10));
}
}
return val;
}