我正在学习C,我无法弄清楚其中一个K&R练习,列表:
练习2-3,编写函数
htoi(s),它将一串十六进制数字(包括一个可选项0x或0X)转换为等效的整数值.允许的数字是0通过9,a通过f和A通过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()的简单实现留给了你:)
米奇有正确的基本想法,但让我们更详细一点.
十六进制数字只是基数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",你需要确保你处理这些情况.
对于那些熟悉数学的人来说,从左到右处理字符串更简单,而且可以说更易读。该战略意识到,例如,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)
既然你正在学习,就值得研究编码风格并确定它是否有帮助,这样你就能尽早养成良好的习惯。
玩得开心!