十六进制到十进制转换[K&R练习]

6 c kernighan-and-ritchie

我正在学习C,我无法弄清楚其中一个K&R练习,列表:

练习2-3,编写函数 htoi(s),它将一串十六进制数字(包括一个可选项0x0X)转换为等效的整数值.允许的数字是0通过9,a通过fA 通过F.

我想我需要在这里做一些递归,我只是猜测我对编号类型及其各种转换方法等了解不多.

有人可以给我一些关于如何最好地理解它的指示,我不是在找人握住我的手,而是指导我找到正确理解的方法,这样我就能以最优雅的形式写出来,而不是同 printf("%x", skill);

Mit*_*eat 12

不需要递归.您只需要在字符串上向后循环(即从单位列开始),将单位数转换时间与它的基数位置乘数相加.这是伪代码,不处理可选的0x前缀(并且不检查溢出的可能性):

long total = 0;
long multiplier = 1;
for (int i = string.length - 1; i >= 0 i--)
{
   digit = ConvertSingleHexDigittoInt(string[i]);
   total += digit * multiplier;
   multiplier *= 16;
}
Run Code Online (Sandbox Code Playgroud)

我已经将ConvertSingleHexDigittoInt()的简单实现留给了你:)

  • 我不是想让海报变得简单.我正在努力鼓励他们通过伸出援助之手来解决问题.我不认为值得投票. (3认同)

Cha*_*tin 5

米奇有正确的基本想法,但让我们更详细一点.

十六进制数字只是基数16,这意味着数字(从右到左)的值为

数字×16 0(即1)
数字×16 1(即16)
数字×16 2(256)

等等.例如,0xE为14.

你想要的是一个从字符串右端开始的循环.假设字符串是s,length(s)是字符串的长度.在伪代码中,你想要

value = 0
r = 1   // ask yourself "what values does r take as this proceeds?"
for i from length(s)-1 to 0   // Ask yourself "why length(s)-1?"
   value = value + (digitval(s[i])*r)
   // get ready for the next digit
   r = r * 16
Run Code Online (Sandbox Code Playgroud)

digitval(char c) 需要是一个函数,将"0123456789ABCDEF"中的一个checract转换为0到15之间的值(包括在内).我将把它留作练习,只有一个提示:"数组".

小心一个额外的问题; 因为你可以有一个前导"0"或"0x",你需要确保你处理这些情况.


Ada*_*iss 5

对于那些熟悉数学的人来说,从左到右处理字符串更简单,而且可以说更易读。该战略意识到,例如,1234 = (((1 x 10) + 2) x 10 + 3) x 10 + 4

换句话说,当您从左到右处理每个数字时,将前一个总数乘以基数,有效地将其“向左移动”一个位置,然后添加新的数字。

long decFromHexStr(const char *hexStr)
{
    int i;
    long decResult = 0;  // Decimal result

    for (i=0;  i < strlen(hexStr);  ++i)
    {
        decResult = 16 * decResult + decFromHexChar(hexStr[i]);
    }
    return decResult;
}
Run Code Online (Sandbox Code Playgroud)

有经验的程序员可能会使用指针来逐步遍历字符串,而不是将其视为数组:

long decFromHexStr(const char *pHex)
{
    long decResult = 0;

    while (*pHex != '\0')
    {
        decResult = 16 * decResult + decFromHexChar(*pHex++);
    }
    return decResult;
}
Run Code Online (Sandbox Code Playgroud)

既然你正在学习,就值得研究编码风格并确定它是否有帮助,这样你就能尽早养成良好的习惯。

玩得开心!