删除c中的前导零

时间:2017-11-22 21:52:35

标签: c function gcc zero

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

BarProtocol

2 个答案:

答案 0 :(得分:1)

// 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] ) ;
}    

请注意,dec2bin会在int中生成一个二进制数字数组。这显然不是从十进制转换为二进制,因为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) ) ;

答案 1 :(得分:0)

这里有一些问题。

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

你可以做的是循环你的阵列,寻找第一个&#34; 1&#34;然后开始打印。你可以使用一个标志。

注意:如果用户输入&#34; 0&#34;,只需打印&#34; 0&#34;,无需调用您的功能。

以下是一个例子:

#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