gpt4 book ai didi

c - 重新编码 itoa : error on minimum int

转载 作者:太空宇宙 更新时间:2023-11-04 07:04:40 24 4
gpt4 key购买 nike

我正在尝试重新编码 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 之外的其他 header 。我也被限制在三个功能上,malloc,free和write。但是,我确实重新编写了 strdup 和 libc 中的许多函数。

有人可以解释为什么该行会声明我需要的确切内存量:

char   buf[sizeof(int) * CHAR_BIT / 3 + 3];

此外,

Using unsigned to compute the digits would avoid the problem with INT_MIN. Bug fix for INT_MIN.

为什么?

最佳答案

您的代码有几个小问题:

  • 缓冲区太大:包括符号和空终止符,24 个字节应该足够了。对于绝对可移植性,sizeof(int)*CHAR_BIT/3 + 3 的上限是正确的。 不是错误,而是浪费

  • 如果将数字从右到左存储到缓冲区中,则不需要最后的反相,可以直接调用strdup()更简单、更快速

  • 使用 unsigned 计算数字可以避免 INT_MIN 的问题。 INT_MIN 的错误修复

  • 循环获取 i >= 10 并单独存储最后一位数字可以避免 0 的特殊情况。 更简单、更快、更少的部门

  • 您应该使用 '0' 而不是硬编码 ASCII 值 48更具可读性和便携性

修改后的版本:

#include <limits.h>

char *ft_itoa(int n) {
char buf[sizeof(int)*CHAR_BIT/3 + 3];
char *s;
unsigned int v;

v = n;
if (n < 0) {
v = -v;
}
s = buf + sizeof(buf);
*--s = '\0';
while (v >= 10) {
*--s = '0' + v % 10;
v /= 10;
}
*--s = '0' + v;
if (n < 0)
*--s = '-';
return strdup(s);
}

如果 strdup 在您的系统上不可用,如果您从堆中分配字符串,它很容易实现并且非常有用。

关于c - 重新编码 itoa : error on minimum int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34167437/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com