2012-09-09 57 views
4

我有一個賦值,我需要在C中打印一個整數而不使用printf,putchar等。不允許包含頭文件。沒有函數調用,除了我寫的任何東西。我有一個函數my_char我正在使用(也許是錯誤的),但它打印出一個字符。我目前有以下代碼向後打印數字。不尋找答案。只是尋找一些方向,一些幫助,也許我看着它完全錯了。在沒有Printf或任何函數的情況下在C中打印int

void my_int(int num) 
{ 
    unsigned int i;  
    unsigned int j; 

    char c; 

    if (num < 0)  
    { 
     my_char('-'); 
     num = -num; 
    } 

    do  
    { 
     j = num % 10; 
     c = j + '0'; 
     my_char(c); 
     num = num/10; 
    }while(num >0); 
} 
+1

一種可能性是使用遞歸。還要注意,如果'num == INT_MIN'(至少在典型的2補碼機上)你的代碼將會失敗。 –

+0

忘了提及,我很抱歉,不允許使用遞歸(我知道,令人沮喪) – CLZ828

+0

如果從字面上不允許包含頭文件,您不能將它打印到標準輸出 - 即使是'寫'系統調用這是要使用內聯彙編訪問)在頭文件中聲明... – 2012-09-09 22:55:20

回答

2

一個選項可能是遞歸地做到這一點,所以數字按照正確的順序打印出來。

在這種情況下,而不是一個do/while循環,你會有一個更類似於這樣的構造,其基本情況爲num = 0。

if(num==0) 
    return; 

j = num % 10; 
c = j + '0'; 
my_int(num/10); 
my_char(c); 

編輯:注意到您不允許使用遞歸。這有點難看,但你可以檢查號碼中的數字,然後在數字中向後循環。

要查找的數字位數,

int digitDivide = 1; 
int tempNum = num; 
while(tempNum>0){ 
    tempNum= tempNum/10; 
    digitDivide=digitDivide*10; 
} 

,然後用它來通過數字環路如下:

digitDivide = digitDivide/10; 
while(digitDivide>0){ 
    tempNum = (num/digitDivide)%10; 
    c = j + '0'; 
    my_char(c); 
    digitDivide=digitDivide/10; 
} 
+0

OP說沒有遞歸(看評論):( –

+0

是的,這是我開始輸入我的答案=/ – Lincoded

5

在循環,而不是「打印」調用my_char()而不是將字符轉換爲緩衝區,然後反向循環緩衝區以將其打印出來。

原來你不能使用數組。在這種情況下,您可以用循環計算出10的最大功率(即log10)。然後使用這個從第一位數字向後工作。

unsigned int findMaxPowOf10(unsigned int num) { 
    unsigned int rval = 1; 
    while(num) { 
     rval *= 10; 
     num /= 10; 
    } 
    return rval; 
} 

unsigned int pow10 = findMaxPowOf10(num); 

while(pow10) { 
    unsigned int digit = num/pow10; 
    my_char(digit + '0'); 
    num -= digit * pow10; 
    pow10 /= 10; 
} 
+0

後,「我也不能malloc任何東西或聲明數組」。 – 2012-09-09 23:09:50

+0

哎呀,該評論被隱藏。 – James

+0

看起來像我們兩者都得出了大致相同的答案。 – Lincoded

0

可以轉換一個int爲char *,char *與顯示該字符*:

char  *put_int(int nb) 
{ 
char  *str; 

str = malloc(sizeof(char) * 4); 
if (str == NULL) 
    return (0); 
str[0] = (nb/100) + '0'; 
str[1] = ((nb - ((nb/100 * 100))/10) + '0'); 
str[2] = ((nb % 10) + '0'); 
return (str); 
} 

void  put_str(char *str) 
{ 
while (*str) 
    write(1, str++,1); 
} 

int main(void) 
{ 
put_str(put_int(42)); 
return (0); 
} 
相關問題