删除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] ) ;
}
注意 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) ) ;
你这里有一些问题。
- 缺少 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
我想将十进制转换为二进制,但输出应该没有前导零,那么如何删除零? (代码有效,它是用 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] ) ;
}
注意 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) ) ;
你这里有一些问题。
- 缺少 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