将十进制转换为二进制错误(C)

时间:2016-09-03 18:40:14

标签: c binary decimal

我最近开始用C编程,无论我怎么努力,我都无法在这里找到错误。

char* dec2Bin(int number) {
    char* bin = calloc(9, sizeof(char));
    if(bin!=NULL) {
      bin[8] = '\0';
      int i = 7;
      while(number != 0 && i>=0){
          bin[i] = (number%2) +'0';
          number/=2;
          i--;
      }
    }
    return bin;
}


int main() {
    int number;
    printf("Enter a number: ");
    scanf("%d", &number);

    char* bin = dec2Bin(number);
    if(bin!=NULL) {
      printf("%s", bin);
      free(bin);
      return EXIT_SUCCESS;
    }

    return EXIT_FAILURE;
}

输入数字后没有显示任何内容,奇怪的是,当我在函数循环中执行printf时,它会为bin [i]打印一些内容。

先谢谢你的帮助。

3 个答案:

答案 0 :(得分:2)

尝试:

char* int2Bin(int number) 
{
    int bits = sizeof(int) * CHAR_BIT;
    char* bin = calloc(bits + 1, sizeof(char));
    bin[bits] = '\0';
    for (int i = bits - 1; i >= 0; i--) 
    {
        bin[i] = (number % 2) + '0';
        number /= 2;
    }
    return bin;
}

说明:CHAR_BIT(在<limits.h>中)是char中的位数,sizeof(int)charint的位数{1}}。

您的代码可能不显示任何内容,因为您的循环在到达分配的数组的第一个char之前停止,因此这可能仍为'\0',因此被视为空字符串。

您可以执行以下操作:

,而不是使用较慢的%/
        bin[i] = (number & 1) + '0';
        number >>= 1;

答案 1 :(得分:2)

void *calloc(size_t nmemb, size_t size)分配nmemb个内存块,并使用0初始化它们,这个场景的字符串为\0字符。现在,printf将打印bin字符串,直到它获得\0字符。让我们举个例子。如果我输入12,则输出应为1100。但是在bin字符串中,它是\0\0\0\01100\0。因此printf在遇到第一个\0字符后停止打印。

答案 2 :(得分:1)

    after  char* bin = calloc(9, sizeof(char)); 

下面的代码

      for(int i=0;i<8;i++)
       bin[i]='0';

因为你正在从右到左填充你的垃圾箱。但如果你不填充bin的0位置,则意味着bin凝视位置包含'\ 0'由calloc函数初始化