【发布时间】: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。总而言之,这张表将字符的外观映射到它们在内存中的存储方式
标签: c