首页 > 解决方案 > C - htoi 函数

问题描述

我正在尝试编写一个htoi函数来C读取十六进制数字流,包括前导0xor 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;
}

标签: cnumbershex

解决方案


for您的语句后缺少一组花括号!就目前而言,循环的主体只是以下代码:

        if (s[i] >= '0' && s[i] <= '9') {
            hexdigit = s[i] - '0';
            n = 16 * n + hexdigit;
        }

这是因为,如果没有紧跟在语句后面的{...}分隔块,那么只有一个语句用于循环(并且这个“单个语句”是整个第一个块)。在第三个块之后添加相关的行(或在它之后的行,如果您愿意)和相应的修复代码:forif{for} 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字符串的终止符。


推荐阅读