为啥 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, &nb, 1);
正在 stdout 上写入一个字节,但该字节未编码为十进制数字。您需要使用nb
和write(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'
,但充其量是 0
到 9
的值。见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() 不打印数字?的主要内容,如果未能解决你的问题,请参考以下文章