使用C将十六进制字符串常量转换为十进制值

下面的程序给出结果,0而不是十六进制字符串常数的预期十进制当量。

#include <stdio.h>

int my_htoi(char[]);

int main(void) {
    printf("%d", my_htoi("0xABC"));
    return 0;
}

int my_htoi(char str[]) {
    int i, num = 0;
    for (i = 0; i != '\0'; ++i) {
        if (str[i+1] == 'x' || str[i+1] == 'X') {
            i = i + 1;
            continue;
        }
        if (str[i] >= '0' && str[i] <= '9') {
            num = num * 16 + (str[i] - '0');
        } else if (str[i] >= 'a' && str[i] <= 'f') {
            num = num * 16 + (str[i] - 'a' + 10);
        } else if (str[i] >= 'A' && str[i] <= 'F') {
            num = num * 16 + (str[i] - 'A' + 10);
        }
    }
    return num;
}

尽管以下程序运行良好,并输出了十六进制字符串常量的正确十进制等效项。

#include <stdio.h>
#include <string.h>

int my_htoi(char[]);

int main(void) {
    printf("%d", my_htoi("0xABC"));
    return 0;
}

int my_htoi(char str[]) {
    int i, num = 0;
    for (i = 0; i < strlen(str); ++i) {
        if (str[i+1] == 'x' || str[i+1] == 'X') {
            i = i + 1;
            continue;
        }
        if (str[i] >= '0' && str[i] <= '9') {
            num = num * 16 + (str[i] - '0');
        } else if (str[i] >= 'a' && str[i] <= 'f') {
            num = num * 16 + (str[i] - 'a' + 10);
        } else if (str[i] >= 'A' && str[i] <= 'F') {
            num = num * 16 + (str[i] - 'A' + 10);
        }
    }
    return num;
}

唯一的区别是我们找到循环的合格条件的方式。为什么它不能与空字节检查一起使用?

chqrlie

您的代码中存在一些问题:

  • 将循环索引i'\0'而不是进行比较str[i],从而导致循环立即终止,返回值为0

  • 的测试x不正确:这将导致"1x2"转换为2而不是1

  • 您接受超出范围的字母f并将其转换为数字。该函数应改为在不是十六进制数字的第一个字符处停止解析。

这是更正的版本:

#include <stdio.h>

int my_htoi(const char[]);

int main(void) {
    printf("%d", my_htoi("0xABC"));
    return 0;
}

int my_htoi(const char str[]) {
    int i = 0, num = 0;
    if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
        i += 2;
    for (; str[i] != '\0'; ++i) {
        if (str[i] >= '0' && str[i] <= '9') {
            num = num * 16 + (str[i] - '0');
        } else if (str[i] >= 'a' && str[i] <= 'f') {
            num = num * 16 + (str[i] - 'a' + 10);
        } else if (str[i] >= 'A' && str[i] <= 'F') {
            num = num * 16 + (str[i] - 'A' + 10);
        } else {
            break;
        }
    }
    return num;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Python将十六进制字符串转换为十进制值

如何将十六进制字符串转换为十进制值

将十六进制字符串转换为无符号十进制值

将C中的十六进制字符串转换为十进制

将字符串转换为十六进制,十进制和八进制

如何将十进制转换为十六进制字符串的十六进制和XOR

从 jq 得到的十六进制字符串无法转换为十进制值

将十进制NSString转换为十六进制字符串

Spark:将十六进制字符串转换为十进制

将十六进制字符串转换为十进制整数

如何将很大的十进制字符串转换为十六进制?

将大的十六进制字符串转换为十进制

将十六进制字符串转换为十进制整数

将长十六进制字符串拆分为列值并转换为十进制

如何在 C++ 中将十六进制转换为十进制字符串?

C#将十六进制字符串转换为十进制。为什么是负值?

我将如何使用 js 将十进制数转换为十六进制字符串?

Arduino:将十六进制字符串转换为uint64或十进制字符串

Python Pandas子集十六进制字符串,转换为十进制

在arduino中将十六进制字符串转换为十进制

在javascript中,如何将十进制(带小数点)转换为十六进制字符串

Java通用将字节数组转换为字符串(非十六进制,十进制)

使用python将十六进制十进制数字转换为十进制

将十六进制字符串值转换为十六进制数字

使用 C 将 u64 十进制转换为十六进制

如何使用C语言将十六进制数组转换为十进制

使用Perl将ASCII十六进制字符串转换为相同的十六进制值

Python将十进制转换为十六进制

PHP将十进制转换为十六进制