2011-04-03 16 views
6

是否有可能打印實際上並沒有使用任何的*printf函數(printffprintf(到stdout,或者一個文件)的數(intfloatdoublelong等), sprintf,snprintf,vsprintf,...)?打印數量,而無需使用* printf的

+4

'float'和'double'不是整數。 – dreamlax 2011-04-03 08:17:38

+0

爲什麼你需要? – gnud 2011-04-03 08:24:16

+1

可能重複[如何打印出IEEE754號碼(不含printf)?](http://stackoverflow.com/questions/4274926/how-do-you-print-out-an-ieee754-number-without- printf) – 2011-04-03 08:29:23

回答

7

如果你的libc包含一個itoa()函數,你可以用它來將一個整數轉換爲一個字符串。
否則,您將不得不編寫代碼將數字轉換爲字符串。

itoa()實現從C Programming Language, 2nd Edition - Kernighan and Ritchie第64頁:

/* itoa: convert n to characters in s */ 
void itoa(int n, char s[]) 
{ 
    int i, sign; 

    if ((sign = n) < 0) /* record sign */ 
     n = -n;   /* make n positive */ 
    i = 0; 
    do { /* generate digits in reverse order */ 
     s[i++] = n % 10 + '0'; /* get next digit */ 
    } while ((n /= 10) > 0); /* delete it */ 
    if (sign < 0) 
     s[i++] = '-'; 
    s[i] = '\0'; 
    reverse(s); 
} 
+2

OP應該知道這在Linux上不存在。如果他擦掉K&R並轉到第56頁,他會看到一個實施。 – 2011-04-03 08:20:50

+0

好主意,並且實施itoa也不難:http://codepad.org/fUlU6thO – hiobs 2011-04-03 08:32:49

+0

唉,即使K&R也不處理INT_MIN .. – lowq 2017-10-27 04:16:29

2

只需使用write()函數和你自己格式化輸出。

3

那麼,它不難完成的整數,但工作是一個浮點數更復雜一點,有人已經發布了一個指針來解釋這一點。對於整數,你可以這樣做:

void iprint(int n) 
    { 
    if(n > 9) 
     { int a = n/10; 

     n -= 10 * a; 
     iprint(a); 
     } 
    putchar('0'+n); 
    } 
0

我認爲遇到這個問題,因爲他們寫自己的串行TX功能和需要打印一些數字最多的人。您將需要修改putc電話以適應您的設置。

void print_int(int num) 
{ 
    if (num < 0) 
    { 
     putc('-'); 
     num = -num; 
    } 
    else if (num == 0) 
    { 
     putc('0'); 
     return; 
    } 
    while (num != 0) 
    { 
     putc ('0'+ (num%10)); 
     num /= 10; 
    } 
} 

這將打印一個相反的數字。

+0

問題不在於如何以相反方式打印數字。這是如何打印一個數字。 – 2017-10-05 04:07:00

2

這將導致正確的順序:

void print_int(int num){ 
    int a = num; 

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

    if (num > 9) print_int(num/10); 

    putc('0'+ (a%10)); 
}