1

我正在尝试实现 htoi(s) [Dennis Ritchie 第 2 章练习 2-3 Q],它将十六进制数字字符串转换为其等效整数,任何人都可以帮助我解决这个程序的逻辑,我不需要代码,我只需要实现它的逻辑。我无法得到正确的逻辑

4

3 回答 3

1

让我们退后一步:

您将如何实现一个接受单个十六进制数字并返回其十进制等效值的函数?

换句话说,你将如何编写这个函数:

unsigned int hextodec(char c)
{
    ... your code here
}

提示:对于十进制数字,计算时会发生什么c -'0'

一旦你有了这个函数,用它来计算更长的十六进制字符串的转换应该是相当容易的。

提示:0xF 是 15,0x10 是 16

于 2012-11-26T16:39:19.567 回答
0

使用strtol以 16 为底的函数。

关于这种方式:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int xstrtol16(const char *s)
{
    errno = 0;
    char *endp = NULL;
    int result = strtol(s, &endp, 16);

    if (*charp || errno) {
       fprintf(stderr, "Failed to convert...\n");
       exit(1);
    }

    return result;
}
于 2012-11-26T16:33:58.427 回答
0

想想什么是可打印的数字(任何基数)。基本上是代表简单数值(0...base-1)的符号列表,以及它们数字位置的相关“权重”。对于十进制,符号为“0123456789”,权重为 1、10、100、1000...

您可以通过查找每个符号的相应数值,将其乘以该数字位置的权重,并将这些乘积相加,将可打印数字转换为“整数”。有一些技巧可以有效地做到这一点,但是直接的“愚蠢”实现可以完美地完成工作。

十六进制有点复杂,因为有两个符号 - 0-9 和 AF - 有时需要同时接受大写和小写字母。处理这个问题还有一些技巧,但是以直接的方式进行(将每个字符与每次运行的限制进行比较并确定它适合哪个)是非常好的(并且比其他方法更通用)。您甚至可以使用索引操作,您只需在“0123456789ABCDEF”中找到字符的索引 - 效率低但简单。

于 2012-11-26T16:55:02.217 回答