这是一个类,所以它必须使用递归,我已经迭代地编写了一个工作代码,但我无法让它在递归中工作,我真的迷失了.我已经为此工作了一个星期.任何指导或建议都会非常有帮助.
这是我的函数,我需要将十六进制作为char指针并输出相应的十进制数.我经常遇到堆栈溢出或内存分配运行时错误,任何人都可以识别出错误并引导我朝着正确的方向前进吗?
int hexToDecimal(const char *hex, int offset, int power){
if(offset >= 0){
hexChar = *(hex+offset);
if( isalpha(hexChar) ) {
hexChar = toupper(hexChar);
hexNum = hexChar - asciiCharOffset;
} else {
hexNum = hexChar - asciiIntOffset;
}
return hexToDecimal(hex, offset--, power++) + hexNum * (int)pow(16,power);
} else {
return 0;
}
}
Run Code Online (Sandbox Code Playgroud)
我没有编译它,但第一眼就告诉我相应的行应该是:
return hexToDecimal(hex, offset-1, power+1) + hexNum * (int) pow(16,power-1);
Run Code Online (Sandbox Code Playgroud)
因为在你的情况下,你无限地称呼自己(被称为,假设偏移6,如果你传递偏移 - 它仍然会传递6,因为它会在给函数赋值后减少).
此外,后增量将为pow(16,power)稍后在同一表达式中的调用提供未定义的行为,因为(再次以power = 6为例),它可能是pow(16,6)或pow(16,7)取决于编译器.
除此之外,还存在风险,当转换为int时,pow()将给出错误(向下舍入)值(可能会发现pow(16,2)返回255.9999999而你最终得到(int)255,那里有stackoverflow上有充足的证据和解决方案,只需搜索pow).
编辑(回复评论):
最后,介绍神奇的printf调试器:
int hexToDecimal(const char *hex, int offset, int power){
if(offset >= 0){
char hexChar = *(hex+offset);
int hexNum,
recursed;
if( isalpha(hexChar) ) {
hexChar = toupper(hexChar);
hexNum = hexChar - asciiCharOffset;
}
else {
hexNum = hexChar - asciiIntOffset;
}
recursed= hexToDecimal(hexNum, offset-1, power+1);
printf("%d + %d * %d\n", recursed, hexNum, (int)pow(16,power-1));
return recursed + hexNum * (int)pow(16,power-1);
} else {
return 0;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1057 次 |
| 最近记录: |