C - htoi 函数

问题描述 投票:0回答:4

我正在尝试在

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;
}
c numbers hex
4个回答
3
投票

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
终止符。
    


0
投票

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;



0
投票

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; }



0
投票

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; }

	
© www.soinside.com 2019 - 2024. All rights reserved.