删除c中的前导零

Remove leading zeros in c

我想将十进制转换为二进制,但输出应该没有前导零,那么如何删除零? (代码有效,它是用 C 编写的)

int* dec2bin(int, int[]);

main(){
  int var=0;
  int n[16];
  printf("Number(>=0, <65535): ");
  scanf("%d", &var);
  dec2bin(var, n);
  printf(" %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d\n", n[0], n[1],n[2],n[3],n[4],n[5],n[6],n[7],n[8],n[9],n[10],n[11],n[12],n[13],n[14],n[15]);
}

int* dec2bin(int N, int n[]){
  int count = 15;
  for(count=15; count >=0; count--){
    n[count] = N%2;
    N=N/2;
  }
}
// Skip leading zeros
int d = 0 ;
for( d = 0; n[d] == 0 && d < 15; d++ )
{
    // nothing
}   

// Print significant digits
for( ; d < 16; d++ )
{
    printf( "%d ", n[d] ) ;
}    

注意 dec2binint 中生成一个二进制数字数组。这显然不是从 十进制到二进制 的转换,因为 int 已经是二进制 - scanf() 调用已经转换为二进制(int) 与 %d 说明符。该函数过于复杂,因为它已经是二进制的。您实际上在做的只是将单个位扩展为整数值 0 和 1 的数组。

考虑:

int* int2bin( int N, int n[] )
{
  for( int d = 15; d >= 0; d-- )
  {
    n[d] = (N & (0x0001 << d)) == 0 ? 0 : 1 ;
  }

  return n ;
}

然而,将字符串生成为 ASCII 数字而不是整数数组可能更有意义。

char* int2bin( int val, char* str )
{
    // Skip leading zeros
    int d = 0 ;
    for( d = 0; (val & (1<<d)) == 0 && d < 15; d++ )
    {
        // nothing
    }   

    // Significant digits
    for( int s = 0 ; d < 16; s++; d++ )
    {
        str[s] = (val & (1<<d)) == 0 ? '0' : '1' ;
    }    

    str[s] = 0 ;

    return str ;
}

那么输出就是:

  char n[17] ;
  printf("%s", int2bin(var, n) ) ;

你这里有一些问题。

  • 缺少 main() 的类型说明符。一个体面的编译器应该给你这样的警告信息:warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
    • 我不确定您使用的是哪个标准,在 C89 中默认的 return 类型假定为 int。
    • 如果您将 main() 更改为 int main(),那么您应该 return 一个整数值或 EXIT_SUCCESS 如果您包含 stdlib.h.
    • return 0;表示程序执行成功。
  • 你没有return从你的函数中获取任何东西。
    • 好吧,你不需要,因为你传递的是数组,数组会被修改。你实际上是在传递一个指针。

您可以做的是遍历数组,查找第一个“1”,然后开始打印。你可以为此使用一个标志。

注意:如果用户输入“0”,只打印“0”,不需要调用你的函数。

这是一个例子:

#include <stdio.h>

typedef enum { false, true } bool;
void dec2bin(int, int[]);

int main()
{
  int var=0;
  const int size = 16;
  int n[size];
  bool startPrinting = false;

  printf("Number(>=0, <65535): ");
  scanf("%d", &var);

  if (var == 0)
  {
    printf("0\n");
  }
  else
  {
    dec2bin(var, n);
    for (int cnt = 0; cnt < size; cnt++)
    {
      if (n[cnt] == 1) // Check for the first "1" in n
      {
        startPrinting = true;
      }

      if (startPrinting)
      {
        printf("%d", n[cnt]);
      }
    }
    printf("\n");
  }
  return 0;
}

void dec2bin(int N, int n[]){
  int count = 15;
  for(count=15; count >=0; count--){
    n[count] = N%2;
    N=N/2;
  }
}

这是一些示例输出:

> ./out 
Number(>=0, <65535): 32
100000
> ./out 
Number(>=0, <65535): 16
10000
> ./out 
Number(>=0, <65535): 15
1111
> ./out
Number(>=0, <65535): 1
1
> ./out
Number(>=0, <65535): 0
0