为啥 write() 不打印数字?

Posted

技术标签:

【中文标题】为啥 write() 不打印数字?【英文标题】:Why doesn't write() print the numbers?为什么 write() 不打印数字? 【发布时间】:2021-09-22 20:20:44 【问题描述】:

我有:

#include <unistd.h>

//can't use atoi
void    ft_putnbr(int nb)

    if (nb == -2147483648)
    
        write(1, "-2147483648", 11);
    
    if (nb > -2147483648 && nb < 0)
    
        write(1, "-", 1);
        ft_putnbr(nb * -1);
    
    if (nb >= 0 && nb < 10)
    
        write(1, &nb, 1);
        return;
    
    if (nb >= 10 && nb <= 2147483647)
    
        ft_putnbr(nb / 10);
        ft_putnbr(nb % 10);
    


int main(void)

    ft_putnbr(-2147483648);
    write(1, "\n", 1);
    ft_putnbr(-200);
    write(1, "\n", 1);
    ft_putnbr(-1);
    write(1, "\n", 1);
    ft_putnbr(0);
    write(1, "\n", 1);
    ft_putnbr(1);
    write(1, "\n", 1);
    ft_putnbr(9);
    write(1, "\n", 1);
    ft_putnbr(10);
    write(1, "\n", 1);
    ft_putnbr(11);
    write(1, "\n", 1);
    ft_putnbr(2147483647);

如果我用 printf 替换它,我只会得到第一个条件,但除了“-”之外什么都没有,我确实得到了它们。但是即使我添加了一个新功能,例如:

void print(char c)

    write(1, &c, 1);

然后放:

print((char) nb);

我仍然没有得到任何东西。 只需这样做:

print(nb + 48);

我得到想要的输出了吗? 发生了什么事?

【问题讨论】:

您确实应该使用else if 而不是if 进行第一次之后的所有检查。 无论如何,你需要了解'0'0的区别。她们不一样。尝试做'0' == 0 看看你会得到什么。您想将'0' 写入文件,而不是0,其他数字也类似。 '0' 是一个字符代码。 0 是一个整数,其值对应于空字符。 这一行 write(1, &amp;nb, 1); 正在 stdout 上写入一个字节,但该字节未编码为十进制数字。您需要使用nbwrite(1, digitArray+nb, 1); 索引的字符数组('0'、'1'、...'9'),而不是您正在执行的操作。如果您通过od 将现有命令的输出通过管道传输,那么您会更好地看到正在打印的内容。 除了0'0' 的问题之外,递归是编写itoa 最酷的方式,这基本上就是这里发生的事情。 查看this(ASCII 表)。您会发现 (char)0 到 (char)9 实际上用于格式化退格和制表符等或用于 NULL 等特殊含义。因此,您不会将它们视为数字。当你加 48 时,就像在表中说 `0+'0'`` 或 48,即 0。总而言之,这张表将字符的外观映射到它们在内存中的存储方式 【参考方案1】:

要将字符'0' 打印到'9',代码需要将'0' 添加到 nb。尝试打印nb 的第一个字节可能会访问其最低或最高有效字节 - 取决于endian。 IAC,它没有访问数字字符:'0''9',但充其量是 09 的值。见Jeff Holt。

if (nb >= 0 && nb < 10) 
    // write(1, &nb, 1);
    char ch = nb + '0';  // Convert value to digit character.
    write(1, &ch, 1);
    return;


为了好玩,C99 或更高版本的替代简化:

// Only pass value <= 0
static void ft_putnbr_helper(int nb) 
  if (nb <= -10) 
    ft_putnbr_helper(nb/10);
  
  putchar('0' - nb%10);  // Go from value to digit character.


void ft_putnbr(int nb) 
  if (nb < 0) 
    putchar('-');
    ft_putnbr_helper(nb);
   else 
    ft_putnbr_helper(-nb);
  

为什么要用int的反面? 避免-INT_MIN的UB。

【讨论】:

以上是关于为啥 write() 不打印数字?的主要内容,如果未能解决你的问题,请参考以下文章

串口为啥自动打印数据

stm32 串口发送数组 为啥串口发送不出去我打印的四个数字

为啥我的打印功能不起作用?链表

为啥这段代码不打印我的数组?

为啥python在多行中打印一个多位数字?

为啥这段代码会打印出无穷大的数字? [关闭]