【问题标题】:How to Make atoi huge-numbers proof? [closed]如何制作atoi大数证明? [关闭]
【发布时间】:2021-09-16 04:12:41
【问题描述】:

您好,我正在尝试使用其他一些附加条件重新创建 atoi,主要计算有多少个符号,如果负数为偶数,则返回正数,否则为负数,脚本工作正常。它应该用 int 类型创建的问题,它将用一些非常大的数字进行测试,例如 19999999999 ,我试图转换它的返回值但愚蠢地忘记它总是会返回它的类型。任何想法 ?谢谢

#include <stdio.h>

int ft_checksign(char *str)
{
    int i;
    int sign;

    sign = 0;
    i = 0;
    while (*(str + i))
    {
        if (*(str + i) == '-')
            sign += 1;
        i++;
    }
    return (sign);
}

int ft_atoi(char *str)
{
    long long result;
    int i;

    i = 0;
    result = 0;
    while ((*(str + i) >= 9 && *(str + i) <= 32)
        || *(str + i) == '-' || *(str + i) == '+')
        i++;
    while (*(str + i) && (*(str + i) >= '0' && *(str + i) <= '9'))
    {
        result *= 10;
        result += (long long)str[i] - '0';
        i++;
    }
    if (ft_checksign(str) % 2 == 1)
        return ((long long)-result);
    else
        return ((long long)result);
}
int main()
{
    printf("%i", ft_atoi("19999999999"));
    return 0;
}

输出

-1474836481

【问题讨论】:

  • 您似乎在问如何将值作为 int 返回,其中该值大于 int 可以容纳的值。那是不可能的。如果这不是问题,那么请澄清。例如,您可以更改函数的返回类型(但它当然不会是atoi)——这是否可以接受?
  • 这正是我的任务,使 atoa big-numbers proof ,我不知道这是不可能的,只要提出问题
  • 要么你误解了要求,要么你被要求做一些不可能的事情(我猜是前者)。
  • “愚蠢地它总是返回它的类型” - ???这并不愚蠢,这就是类型的工作方式。如果您希望它返回不同的类型,则将该类型作为返回类型!

标签: c casting atoi long-long


【解决方案1】:

在上面的 cmets 部分中,您说:“我的任务是制作 atoa 大数证明。”

幸运的是,我们有 strtoxx 函数,但这不是这里的问题。

让我们看一下atoi 文档:

说明

atoi() 函数将字符串的初始部分 ... 转换为 int ... 除了 atoi() 不检测错误。

返回值

转换后的值或错误为 0。

错误

errno 未设置为错误,因此无法区分 0 是错误还是转换后的值。不检查上溢或下溢。 ...

如果您认为int 具有 16 位或 32 位,则您将被限制在某个范围内。不要忘记,int 是有符号类型,这意味着为符号保留一位。

你要解决的问题很简单:实现一个atoi函数,这样就可以区分0或错误,并实现上溢和下溢的检查。由于errno没有设置,errno是全局的,相应设置。

来自strtol

返回值

strtol() 函数返回转换结果,除非值会下溢或溢出。如果发生下溢,strtol() 返回 LONG_MIN。如果发生溢出,strtol() 返回 LONG_MAX。在这两种情况下,errno 都设置为 ERANGE。

错误

ERANGE 结果值超出范围。

如果没有执行转换(没有看到数字,返回 0),实现也可以将 errno 设置为 EINVAL。

最后但同样重要的是:strtol.c

【讨论】:

    猜你喜欢
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    相关资源
    最近更新 更多