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

标签 c kernighan-and-ritchie

以下程序给出的结果为 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;
}

唯一的区别在于我们找到循环的合格条件的方式。为什么它不适用于空字节检查?

最佳答案

错误的代码:i != '\0' 检查 index 是否为 0。

for(i = 0; i != '\0'; ++i) {

应该是下面检查元素 str[i] 是否是空字符

for(i = 0; str[i] != '\0'; ++i) {

存在其他问题 unneeded increment , int 溢出(这里最好使用 unsigned),错误的 x 检测 - 考虑“0x0x0x1”,前导 -或者 +, char str[] --> const char str[], ...

关于使用C将十六进制字符串常量转换为十进制值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55049588/

相关文章:

c - Windows 中 setenv 的等效项是什么?

C:如何区分字符串和整数?输出可以很好地打印整数,但不能打印字符串

c - 在 Linux 环境中用 C 编写文件的问题

创建线程并将结构传递给它

来自 K&R 的字符计数示例

c - 在 C 中使用寄存器变量的一个很好的例子是什么?

无法打印 char 数组的元素

c - 如何在C中读取并保存txt的可变部分

c - 使用 getchar() 获取一行时出现无限循环

c - KR练习4.7 Ungets功能测试