简单的C函数返回废话

时间:2017-06-07 04:11:09

标签: c

我需要创建将二进制数(字符串)转换为十进制数(long)的简单函数。当它返回结果时,它是无意义的。我试图返回所有其他变量并返回正确的数字。我的结果变量有问题。

#include "stdio.h"
#include "string.h"
#include "math.h"

long bintodec(const char *bin_num) {
        long DIGIT, SUBTOTAL, RESULT = 0, I, LEN;
        LEN = strlen(bin_num);
        for(I = 0; I != LEN; I++) {
                sscanf(&bin_num[I], "%li", &DIGIT);
                SUBTOTAL = DIGIT * pow(2, LEN - I - 1);
                RESULT = RESULT + SUBTOTAL;
        }
        return RESULT;
}

main() {
        clrscr();
        printf("%li", bintodec("101"));
        getch();
}

3 个答案:

答案 0 :(得分:1)

sscanf期待一个C字符串:

  • 在第一次迭代中,它会收到"101"101 * 4404
  • 在第二次迭代中,它会收到011 * 22
  • 在第三次迭代中,它会收到11 * 11
  • 404 + 2 + 1407,这一定是你看到的废话

你想要的是转换每个角色:

DIGIT = bin_num[I] - '0';

答案 1 :(得分:0)

您可以一次性将字符串转换为long,无需循环迭代。如下所示更改代码可以为您提供所需的输出

#include <stdio.h>
#include <string.h>
#include <math.h>

long bintodec(const char *bin_num) 
{
  long DIGIT, SUBTOTAL, RESULT = 0, I, LEN, REM;
  LEN = strlen(bin_num);

  sscanf(bin_num, "%li", &DIGIT);
  printf("DIGIT = %li\n", DIGIT);

  for (I = 0; I < LEN; I++)
  {
    REM = DIGIT%10;
    RESULT += REM * pow(2, I);

    DIGIT /= 10;
  }

  return RESULT;
}

int main() {
  printf("%li", bintodec("101"));
}

答案 2 :(得分:0)

我会提供更优雅的解决方案,而不是调试您的代码。考虑:

long bintodec(const char *bin_num)
{
    long sum = 0;
    for (; *bin_num != '\0'; bin_num++) /* move pointer through string */
    {
        sum <<= 1; /* shift bits left (meaningless on first pass) */
        sum |= (*bin_num == '1'); /* conditionally tack on new least significant bit */
    }
    return sum;
}

一些注意事项:

关键是编码整数类型变量的位与作为字符串传入的二进制序列相同。因此:按位运算符。我们这里唯一需要的是左移位,它将每个底层位移到左边一位,然后按位 - 或者逻辑上或者将两个数字的位相互移位。等效表示使得对问题的图形理解有效。

我们可以将输入的位插入右侧,而不是必须通过整个字符串来确定其长度,并使用它来通知pow函数。

这里是for循环中的内容:

第一遍:

sum <<= :           00000        /* more zero's contained in a long */
string:            "10101"
ptr:                ^
sum |= :            00001

第二遍:

sum:                00010
string:            "10101"
ptr:                 ^
sum:                00010
第三遍:

sum:                00100
string:            "10101"
ptr:                  ^
sum:                00101    

......等等。

一般而言,而不是调用

pow(2, arg)

你应该利用位移运算符,它完全实现乘以2的幂。 (在基数10中附加零乘以10)。