C语言实现:编写属于你自己的 atoi() 函数

C 语言中的 atoi() 函数 接收一个字符串(该字符串代表一个整数)作为参数,并返回其 int 类型的值。因此,基本上该函数用于将字符串参数转换为整数。

语法:

int atoi(const char strn)

参数: 该函数接受一个参数 strn,它指的是需要被转换为等效整数的字符串参数。
返回值: 如果 strn 是有效输入,则该函数返回传入字符串数字对应的等效整数。如果没有发生有效转换,则该函数返回零。
示例:

#include 
#include 
#include 

int main()
{
    int val;
    char strn1[] = "12546";

    val = atoi(strn1);
    printf("String value = %s
", strn1);
    printf("Integer value = %d
", val);

    char strn2[] = "GeeksforGeeks";
    val = atoi(strn2);
    printf("String value = %s
", strn2);
    printf("Integer value = %d
", val);

    return (0);
}

输出

String value = 12546
Integer value = 12546
String value = GeeksforGeeks
Integer value = 0

时间复杂度: O(1)

辅助空间: O(1)

现在,让我们了解在各种条件支持下,创建属于自己的 atoi() 函数的几种方法:
推荐:请在转到解决方案之前,先在“练习”上解决它。
方法 1: 以下是一种不考虑任何特殊情况的基础转换实现。

  • 将结果初始化为 0。
  • 从第一个字符开始,并对每个字符更新结果。
  • 对于每个字符,按照 result = result 10 + (s[i] – ‘0‘)* 来更新答案。
// 在C语言中实现 atoi() 的程序
#include 

// 一个简单的 atoi() 函数
int myAtoi(char* str)
{
    // 初始化结果
    int res = 0;

    // 遍历输入字符串的所有字符
    // 并更新结果
    // 获取相应数字的ASCII字符并
    // 减去 ‘0‘ 的编码以获取数值
    // 将 res 乘以 10 以将数字
    // 向左移位并更新运行总和
    for (int i = 0; str[i] != ‘\0‘; ++i)
        res = res * 10 + str[i] - ‘0‘;

    // 返回结果。
    return res;
}

// 驱动代码
int main()
{
    char str[] = "89789";
  
    // 函数调用
    int val = myAtoi(str);
    printf("%d ", val);
    return 0;
}

输出

89789

时间复杂度: O(N)

辅助空间: O(1)

方法 2: 此实现处理负数。如果第一个字符是 ‘-‘,则将符号存储为负,然后使用之前的方法将字符串的其余部分转换为数字,最后乘上符号。

// 一个C程序,用于
// atoi 的实现
#include 

// 一个简单的 atoi() 函数
int myAtoi(char* str)
{
    // 初始化结果
    int res = 0;

    // 初始化符号为正
    int sign = 1;

    // 初始化第一个数字的索引
    int i = 0;

    // 如果数字是负数,
    // 则更新符号
    if (str[0] == ‘-‘) {
        sign = -1;

        // 同时更新第一个数字的索引
        i++;
    }

    // 遍历所有数字
    // 并更新结果
    for (; str[i] != ‘\0‘; ++i)
        res = res * 10 + str[i] - ‘0‘;

    // 返回带符号的结果
    return sign * res;
}

// 驱动代码
int main()
{
    char str[] = "-123";
  
    // 函数调用
    int val = myAtoi(str);
    printf("%d ", val);
    return 0;
}

输出

-123

时间复杂度: O(N)
辅助空间: O(1)
方法 3: 此实现处理各种类型的错误。如果 str 为 NULL 或 str 包含非数字字符,则返回 0,因为该数字无效。
输出

-134

方法 4: 需要处理四种极端情况:

  • 丢弃所有前导空白字符
  • 数字的符号
  • 溢出
  • 无效输入

要删除前导空白字符,可以运行一个循环直到到达数字字符。如果数字大于或等于 INTMAX/10。那么如果符号为正则返回 INTMAX,如果符号为负则返回 INT_MIN。其他情况在之前的方法中已处理。

演练:

下面是上述方法的实现:

// 一个简单的C++程序,用于
// atoi 的实现
#include 
#include 

int myAtoi(const char* str)
{
    int sign = 1, base = 0, i = 0;
    
    // 如果是空白字符则忽略。
    while (str[i] == ‘ ‘) 
    {
        i++;
    }
    
    // 数字的符号
    if (str[i] == ‘-‘ || str[i] == ‘+‘) 
    {
        sign = 1 - 2 * (str[i++] == ‘-‘);
    }
  
    // 检查有效输入
    while (str[i] >= ‘0‘ && str[i]  INT_MAX / 10 || (base == INT_MAX / 10 && str[i] - ‘0‘ > 7)) 
        {
            if (sign == 1)
                return INT_MAX;
            else
                return INT_MIN;
        }
        base = 10 * base + (str[i++] - ‘0‘);
    }
    return base * sign;
}

// 驱动代码
int main()
{
    char str[] = "  -123";
  
    // 函数调用
    int val = myAtoi(str);
    printf("%d ", val);
    return 0;
}

输出

-123

时间复杂度: O(N)
辅助空间: O(1)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/25818.html
点赞
0.00 平均评分 (0% 分数) - 0