0

我在 C 中的代码遇到了一些问题。它没有按应有的方式转换数字。这是欧几里得算法,用于将给定数字转换为具有不同基数的另一个数字。“精度”是逗号后的位数。

static char* euclid(float number, int base, int precision)
{
    //create a buffer for holding the resulting string
    char* resultString = createBuffer(number, base, precision);
    int numbTemp;
    int numbDiv;

    float maxExponent  = 0;

    while (number >= pow((float)base, (float)maxExponent)) {
       maxExponent++;
    }

    maxExponent--;

   if (maxExponent < 0) {

       maxExponent = 0;
   }

   while (maxExponent >= 0) {
     numbDiv = number / pow(base, maxExponent);
     *resultString += converIntToChar(numbDiv);
     numbTemp = numbDiv * pow(base, maxExponent);
     number -= numbTemp;
     maxExponent--;
     if(maxExponent < 0 && precision >0) {
         *resultString += ",";
         while(precision > 0) {
             numbDiv = number / pow(base, maxExponent);
             numbTemp = numbDiv * pow(base, maxExponent);
             *resultString += convertIntToChar(numbDiv);
             number = number - numbTemp;
             maxExponent--;
             precision--;
         }
     }
  }
  return resultString;
}

将数字转换为字符:

static char convertIntToChar(int number) {
     if (0 <= number && 10 > number) {
          return number + '0';
     }
     else if (16 > number) {
          return number - 10 + 'A';
     }
     else {
          return '\0';
     }
}

“数字”的输入始终是以 10 为底的数字。例如,我尝试使用 170,结果我希望将 170(以 10 为底)作为以 16 为底的数字返回,即AA。但我得到的结果是�。你能帮我找出问题所在吗?另外我用的是linux。所以我使用 gcc 编译器。此外,我正在尝试实现霍纳的方法,我得到与上面相同的结果(�)我的霍纳方法的代码。

static char* horner(float number, int base, int precision) {

    // create a buffer for holding the resulting string.
    char* resultString = createBuffer(number, base, precision);
    int numbDiv = 0;
    int numbTemp = 0;
    int numbConv = 0;

    do {
        numbDiv = number / base;
        numbTemp = numbDiv * base;
        numbConv = number - numbTemp;
        number = numbDiv;
        *resultString += convertIntToChar(numbConv);
    } while (number != 0);

    return resultString;
 }

关于萩

4

2 回答 2

0

您的问题是对什么是混淆*resultString;您应该将精度放在 resultString[idx] 中,其中 idx 是下一个索引,但您所做的只是将值添加到第 0 个字符,因为 *resultString 指向它;

所以这样做:

char * resultString = createBuffer(number, base, precision); 

很好;

*resultString += converIntToChar(numbDiv);

是荒谬的

声明一个索引变量;

char * resultString = createBuffer(number, base, precision); 
size_t idx = 0;

现在稍后:

resultString[idx++] = convertIntToChar(numbDiv);

在你的 while() 中;环形:

*resultString += ","; /* ??? */

变成

 resultString[idx++] = ','; /* note single character quotes */

以及对 *resultString 的其他实例的类似处理;

一旦函数即将返回(即 resultString 准备就绪),您仍然需要一个终止 NULL 字符:

 resultString[idx++] = 0; 
 return;

这也意味着您的 createBuffer 应该在最后返回占 C 字符串的 NULL 字符的内存。

于 2013-05-12T16:10:46.687 回答
0

*resultString += some char不是将字符连接到字符串(如您所料),而是将整数值添加some charresultString.

于 2013-05-12T16:12:03.660 回答