【发布时间】:2016-03-14 01:18:57
【问题描述】:
我正在尝试重新编码 itoa 函数,给定一个 int,它将返回一个表示其十进制值的字符串。到目前为止,这些功能运行良好:
char *ft_itoa(int n)
{
char s[1024];
int i;
int neg;
i = 0;
neg = 0;
if (n == 0)
s[i++] = '0';
if (n < 0)
{
n = n * (-1);
neg = 1;
}
while (n != 0)
{
s[i++] = (n % 10) + 48;
n /= 10;
}
if (neg)
s[i++] = '-';
s[i] = '\0';
return (ft_strrev(s));
}
除了最小的 int 值,-2147483648。在这种情况下,函数返回:
"-./,),(-*,("
威奇……很奇怪。请注意, ft_strrev 将反转结果并对其进行 malloc。有什么线索吗?
编辑:
这里有很多有趣的答案。我对缓冲区的最小尺寸特别感兴趣。使用limits.h 似乎可以解决问题,但我不允许 包含除stdlib.h 和string.h 之外的其他标头。我也受限于三个函数,malloc、free 和 write。但是,我确实从 libc 中重新编码了 strdup 和许多函数。
有人可以解释为什么那行会声明我需要的确切内存量:
char buf[sizeof(int) * CHAR_BIT / 3 + 3];
还有,
使用无符号来计算数字可以避免 INT_MIN 的问题。 INT_MIN 的错误修复。
为什么?
【问题讨论】:
-
请发MVCE。
-
-2147483648*-1在 32 位整数中溢出。 -
@BLUEPIXY 两个标志的限制不应该相同吗?我不明白。
-
32bit int 最大值为
2147483647。 -
0 也包含在数字的总范围内,因此正符号数会少一个数字。
标签: c