【问题标题】:Print an int in C without Printf or any functions在没有 Printf 或任何函数的情况下在 C 中打印一个 int
【发布时间】:2012-09-02 20:16:02
【问题描述】:

我有一个任务,我需要在不使用 printf、putchar 等的情况下在 C 中打印一个整数。不允许包含任何头文件。除了我写的任何东西都没有函数调用。我有一个我正在使用的函数 my_char (可能是错误的),但它会打印出一个字符。我目前有以下代码向后打印数字。不是在寻找答案。只是在寻找一些方向,一些帮助,也许我完全看错了。

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);
}

【问题讨论】:

  • 一种可能性是使用递归。另请注意,如果num == INT_MIN(至少在典型的 2 补码机器上),您的代码将失败。
  • 忘了说,对不起,也不允许使用递归(我知道,令人沮丧)
  • 如果字面上不允许包含任何头文件,则不能将其打印到标准输出 - 即使是在头文件中声明的“写入”系统调用(将使用内联汇编访问) ...
  • 也许stackoverflow.com/questions/468262/… 会有所帮助。 :)
  • @user1658816 你可以使用文本编辑器和编译器,还是应该通过直接用针磁化你的硬盘来做到这一点?

标签: c int printf


【解决方案1】:

不是在循环中调用 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;
}

【讨论】:

  • “另外,我不能 malloc 任何东西或声明数组”。
  • 哎呀,评论被隐藏了。
  • 看起来我们俩的答案差不多。
【解决方案2】:

您可以将 int 转换为 char * 、 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);
}

【讨论】:

    【解决方案3】:

    一种选择可能是递归地执行此操作,因此数字会以正确的顺序打印出来。

    在这种情况下,您将拥有一个更像这样的构造,而不是 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;
    }
    

    【讨论】:

    • OP 说没有递归(见 cmets):(
    • 是的,这是在我开始输入答案后添加的 =/
    猜你喜欢
    • 2020-12-17
    • 2023-02-16
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    相关资源
    最近更新 更多