C中的十进制整数到二进制

时间:2017-03-28 21:07:53

标签: c arrays binary type-conversion decimal

请给我一些关于如何使我的代码更好或更有效的反馈。它应该将十进制整数转换为二进制。

#include <stdio.h>

binarydigits(int div, int dis)
{
    int numit;
    numit=0;

    do
    {
        ++numit;
        div /= dis;
    }
    while (div!=1);
    ++numit;
    return numit;
}

main()
{
    int x, nb, i;

    printf("\n Input an decimal integer number to be converted: ");
    scanf("%d", &x);
    fflush(stdin);

    if (x==0 || x==1)
    {
        printf("\n\n %d in binary : %d", x, x);
    }

    else
    {
        printf("\n\n %d in binary : ", x);
        nb = binarydigits(x, 2);
        // the function 'binarydigits' returns how many binary digits are needed to represent 'x'
        int remind[nb];
        // an array of 'nb' elements is declared. Each element of this array will hold a binary digit
        for(i=(nb-1) ; i>=0 ; --i, x/=2)
        {
            remind[i] = x%2;
        }
        //this 'for' structure saves the remainder of 'x/2' (x%2) in an element of the 'remind[nb]' array

        for (i=nb ; i>0 ; --i)
        {
            printf("%d", remind[nb-i]);
        }
        //this 'for' structure prints the elements of the 'remind[nb]' array in increasing order

    }

    getch();
    return 0;


}

如何改善这一点的任何提示都会很好。

2 个答案:

答案 0 :(得分:1)

首先binarydigits应该有一个返回类型int。这是因为您在此函数末尾返回一个整数变量numit。将您的函数标题更改为:

int binarydigits(int div, int dis)

其次main()函数需要在C和C ++中定义返回类型int。没有它,您的编译器将产生一个警告,类似于:

main.c:18:1: warning: return type defaults to 'int' [-Wimplicit-int]
 main()
 ^~~~

以下是关于main()函数定义的 C11标准(ISO / IEC 9899:2011)的摘录:

  

程序启动时调用的函数名为main。该实现声明此函数没有原型。它应定义为返回类型int且没有参数: - Return Type of main()

int main(void) { /* ... */ }

第三,您应该删除fflush(stdin),因为fflush()使用stdint是未定义的行为,因为它不是标准C的一部分。来自 C11 7.21.5.2 fflush仅适用于输出/更新流,而不适用于输入流:

  

如果stream指向输入流或未输入最新操作的更新流,则fflush函数会将该流的任何未写入数据传递到主机环境以写入文件;否则,行为未定义。 - fflush(stdin)

答案 1 :(得分:0)

  

如何让我的代码更好或更有效?

我给你的建议是停止尝试通过反复试验方法学习C.你应该先获得一本好书然后再学习。如果不掌握指针,按位运算符和内存操作,就不可能创建快速高效 C程序。

简单地说,为了使你的代码更快,你应该完全删除你的代码(我不会在这里列出你所有的不良做法)并开始理解我的例子:

int main(void){
  char *s = (char*)malloc(33);
  char *t = s;
  int a;

  s += 33;
  *s = 0;

  printf("Enter a number: ");
  scanf("%d", &a);
  printf("That number in binary: ");
  while(a){
    *(--s) = a & 1 ? '1' : '0';
    a >>= 1;
  }
  printf("%s\n", s);

  free(t);
  return 0;
}

说明:我们有指针(如果你不知道指针,那么你应该先学习它们)s指向一个字符串的结尾。虽然输入中的数字(数字a)非零,但我们将其最后一位二进制数字放在字符串中,减少指针并将a整数除以2(这是a >>= 1指令)。当a0时,只需打印字符串。