2016-01-13 267 views
-9

我正在重新编写printf函数。问题是有限制,例如我无法打印ULONG_MAX数字。如何在没有printf的情况下打印ULONG_MAX

printf("%lu", ULONG_MAX) gives me ->18446744073709551615 

ft_putnbr(ULONG_MAX) gives me -> -1 

我包括以下两个库:

<limits.h> 
<locale.h> 

,放在我的主要():

setlocale(LC_ALL, ""); 

我putnbr是这样一个基本的递归功能(与其他效果很好号码):

void ft_putnbr(int nb) 
{ 
    if (nb < 0) 
    { 
     ft_putchar('-'); 
     nb = -nb; 
    } 
    if (nb >= 10) 
    { 
     ft_putnbr(nb/10); 
     ft_putnbr(nb % 10); 
    } 
    else 
    { 
     ft_putchar(nb + '0'); 
    } 
} 

任何帮助将不胜感激。

+2

显示ft_myprintf的'()的定义'以及 – CinCout

+0

将它添加到你的问题。并添加ft_nb_arg,ft_print_it和其他任何你正在调用的函数。你认为人们可以阅读你的想法吗? – gnasher729

+0

这是我的代码可用:https://bitbucket.org/zikmout/ft_printf – ziKmouT

回答

0

由于看起来您的代码中隐藏了太长时间无法显示的错误,因此我建议您回到旧的调试。

提示:类型为int的参数将无法保存每个无符号长整型值。

+0

我编辑了主题,我只尝试用我的put_nbr显示这个数字这就是所有 – ziKmouT

1

那么你要做的第一件事就是检查nb是否小于0

这是在ULONG_MAX情况属实(nbint,而不是unsigned int传递),所以你把第一个分支。

"-"被打印,然后-1转向1

在最后一次迭代中,只打印字符1

+0

谢谢它的作品!为了获得最大值,我必须传递一个unsigned long long int! – ziKmouT

0

错误在于您的ft_putnbr()函数需要参数int。当你传递一个类型为unsigned long的变量时,有两个问题。两者都可以在这个片段被复制:

#include <limits.h> 
#include <stdio.h> 

int main() { 
    unsigned long my_long = ULONG_MAX; 
    int my_int = (int) my_long; 
    printf("%lu\n", my_long); 
    printf("%i\n", my_int); 
} 

的第一个问题是,参数是一种比你试图传递给函数的值长度较短的。假设long在我们的系统上是2个字节,而int是1个字节(更现实的情况是它们是4或8个字节)。在二进制中,ULONG_MAX将是1111 1111 1111 1111。但是,当将其分配给int(仅为1个字节)时,值将为1111 1111,因为只有8位的空间。为了通过ULONG_MAX,我们需要一个相同(或更大)长度的类型,因此所有位都有空间。例如,我们可以使用long,以便函数签名变为ft_putnbr(long nb);

但是,仍然存在一个问题。类型long是带符号的(即,其中一个位专用于跟踪数字是否为正数),而ULONG_MAX是无符号类型(即只有正数)。特别是,如果第一位是1,那么表示该数字是负数。所以一个带有二进制值1111 1111 1111 1111的带符号的2字节类型将是负数。它变成(十进制)-1的原因超出了这个答案(但你可以在这里阅读:http://en.wikipedia.org/wiki/Two%27s_complement)。

那么,我们该如何解决这两个问题呢?一种方法是让ft_putnbr()采用非常宽的带符号类型(例如,long long),并且永不传递任何长度相等或更大的无符号类型。另一种方法是编写两个ft_putnbr()(具有不同的名称):一个采用最宽的带符号类型,另一个采用最宽的无符号类型。

0

好,感谢你们我做了两个限制工作(LONG_MAX & LONG_MIN):

void ft_putnbr(long long int nb) 
{ 
    if (nb == LONG_MIN) 
     ft_putstr("-9223372036854775808"); 
    if (nb < 0 && nb != LONG_MIN) 
    { 
     ft_putchar('-'); 
     nb = -nb; 
    } 
    if (nb >= 10 && nb != LONG_MIN) 
    { 
     ft_putnbr(nb/10); 
     ft_putnbr(nb % 10); 
    } 
    else if (nb != LONG_MIN) 
    { 
     ft_putchar(nb + '0'); 
    } 
} 
相关问题