C++我需要编写一个将十六进制转换为十进制并使用递归的函数,并且我不断收到运行时错误

Cha*_*ton 6 c++ recursion

这是一个类,所以它必须使用递归,我已经迭代地编写了一个工作代码,但我无法让它在递归中工作,我真的迷失了.我已经为此工作了一个星期.任何指导或建议都会非常有帮助.

这是我的函数,我需要将十六进制作为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)

Yam*_*dax 7

我没有编译它,但第一眼就告诉我相应的行应该是:

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)