C 用欧几里德算法和霍纳';s法

C 用欧几里德算法和霍纳';s法,c,base,exponent,C,Base,Exponent,我在C语言中的代码有一些问题。它不能正确地转换数字。 这是欧几里德算法,用于将给定数字转换为具有不同基数的另一个数字。“精度”是逗号后的位数 static char* euclid(float number, int base, int precision) { //create a buffer for holding the resulting string char* resultString = createBuffer(number, base, precision);

我在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;
}
问候
Hagi

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

这样做:

char * resultString = createBuffer(number, base, precision); 
天气很好

但是

这是荒谬的

声明一个索引变量

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

resultString[idx++] = convertIntToChar(numbDiv);
在你的时间里();循环:

变成

 resultString[idx++] = ','; /* note single character quotes */
以及*resultString的其他实例的类似处理

一旦函数即将返回(即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';
     }
}
 resultString[idx++] = 0; 
 return;

这也意味着您的createBuffer应该返回用于解释C字符串末尾的空字符的内存。

*resultString+=some char
没有将字符连接到字符串(正如您所期望的那样),相反,它将
some char
的整数值添加到
resultString
的第一个字符中,谢谢您的提示。它起作用了。你能帮我解决另一个问题吗?例如,数字15741.233(以10为基数)应作为3D7D.3BA5(以16为基数)返回。我试过了,得到了3D7D�结果是3。你知道我的代码为什么会这样吗?我不明白� 不再这是因为我没有使用单字符引号。^^但现在我得到了3D7D.3,仍然缺少3个数字。你知道为什么吗?当我用逗号输入一个数字时,我又得到了这个符号�. 举个例子,当我输入15741.233(以10为基数)时,返回3D7D�3(以16为基数,精度为4(逗号后的数字)),但应为3D7D.3BA5。我不知道为什么会这样。有人知道为什么吗?我没有使用单引号字符。现在,我得到3D7D.3作为结果,但仍然有3位数字丢失。有人知道为什么吗?
*resultString += ","; /* ??? */
 resultString[idx++] = ','; /* note single character quotes */
 resultString[idx++] = 0; 
 return;