如何制作atoi巨数证明?

问题描述

你好,我正在尝试使用其他一些附加条件重新创建 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

解决方法

在上面的评论部分,您说:“我的任务是制作大数字证明。”

幸运的是我们有 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