我必须制作自己的printf(用于练习)并且我必须添加%b标志,该标志在二进制基础中打印无符号数字。我已经创建了该函数,但我仍然在输出中得到无符号数。你有我的代码。提前谢谢!
int unsignednbr(unsigned int nb)
{
if (nb < 0)
{
putchar('-');
nb = nb * -1;
}
if (nb >= 10)
{
putnumber(nb / 10);
putnumber(nb % 10);
}
else
putchar(nb + '0');
}
int unsigned_to_binary(int nb)
{
long long binary_nbr = 0;
int remainder;
int i = 0;
unsignednbr(nb);
while (nb != 0)
{
remainder = nb % 2;
nb /= 2;
binary_nbr += remainder * i;
i *= 10;
}
}
void own_printf(char* format, ...)
{
int i = 0;
va_list args;
va_start(args, format);
while (format[i])
{
if (format[i] == '%')
{
switch (format[i + 1])
{
case 'b':
unsigned_to_binary (va_arg( args, int));
break;
}
i++;
}
}
va_end(args);
}
int main()
{
own_printf("%b", -42);
return 0;
}
答案 0 :(得分:0)
我打赌你来自Epitech,你试过问一个助教吗? :P
无论如何,如果您只想打印数字的二进制表示,则可以在循环中使用>>
和&
运算符的组合。您将迭代int
的32位中的每一位,确定它是1
还是0
并打印出来。
unsigned int number = 42;
for (int i = 0; i < 32; ++i) {
if (number >> i & 0x1) putchar('1');
else putchar('0');
}
putchar('\n');
这种方法有许多缺点(没有缓冲,慢,假设int
是32位......)但它应该可以工作。
除此之外,您可能需要在代码中查看一些内容:
unsignednbr
中,检查您收到的作为参数的unsigned int是否小于0
。这是一个总是错误的条件。while
函数中的unsigned_to_binary
循环后,您不打印任何内容。那么这个循环的目的是什么?请记住,值传递的参数是实际副本,并且您对这些副本所做的修改对于接收副本的函数是本地的。在循环之前调用unsignednbr
函数似乎没用。答案 1 :(得分:0)
您可以使用以下(使用递归):
void printBinaryValue(unsigned int num)
{
if(!num) return;
printBinaryValue(num>>1);
putchar(((num&1 == 1) ? '1' : '0'));
}
看到它正常工作here
<强>已更新强>
以下代码将为所有输入提供所需的输出,包括0
(使用while-loop
)。
void printBinaryValue2(unsigned int num)
{
char result[sizeof(num)*8];
int count = 0;
while(num)
{
result[count++] = ((num&1 == 1) ? '1' : '0');
num>>=1;
}
if(count)
{
count--;
while(count>=0)
{
putchar(result[count--]);
}
}
else
{
putchar('0');
}
}