2016-01-13 99 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'); 
    } 
} 
相關問題