2012-09-09 36 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); 
} 
相关问题