📜  编写自己的 atoi()(1)

📅  最后修改于: 2023-12-03 15:27:37.697000             🧑  作者: Mango

编写自己的 atoi()

介绍

在编程中,我们经常需要将字符串转换成整数。C语言提供了一个名为atoi()的函数,可以完成这个任务。但是atoi()函数有一些缺陷,比如不能正确处理非数字字符和正负号等。因此,对于一些特殊的需求,我们需要编写自己的atoi()函数。

本文将介绍如何编写自己的atoi()函数,以及如何处理一些边界情况。

实现

我们可以使用以下函数原型来定义自己的atoi()函数:

int my_atoi(const char* str);

其中str是要转换的字符串。

下面是一个简单的实现:

int my_atoi(const char* str) {
    int result = 0;
    int sign = 1;
    int i = 0;

    // 处理空格
    while (str[i] == ' ') {
        i++;
    }

    // 处理正负号
    if (str[i] == '+' || str[i] == '-') {
        sign = (str[i++] == '+') ? 1 : -1;
    }

    // 处理数字字符
    while (str[i] >= '0' && str[i] <= '9') {
        result = result * 10 + (str[i++] - '0');
    }

    return sign * result;
}
边界情况
空格

我们需要处理字符串中的空格。如果字符串开头有空格,我们应该将指针向后移动到第一个非空格字符的位置。这可以通过以下代码完成:

while (str[i] == ' ') {
    i++;
}
正负号

我们需要处理字符串中的正负号。如果字符串开头有正负号,我们应该将其识别,并相应地设置变量sign。这可以通过以下代码完成:

if (str[i] == '+' || str[i] == '-') {
    sign = (str[i++] == '+') ? 1 : -1;
}
非数字字符

如果在字符串中存在非数字字符,我们应该停止转换并返回当前的结果。这可以通过以下代码完成:

while (str[i] >= '0' && str[i] <= '9') {
    result = result * 10 + (str[i++] - '0');
}
溢出

为了避免在转换大数字时出现溢出,我们应该使用long long类型作为中间变量来存储结果,并在最后将结果转换为int类型。这可以通过以下代码完成:

long long result = 0;

while (str[i] >= '0' && str[i] <= '9') {
    result = result * 10 + (str[i++] - '0');
}

if (result > INT_MAX) {
    result = INT_MAX;
} else if (result < INT_MIN) {
    result = INT_MIN;
}

return (int)result;
总结

在本文中,我们介绍了如何编写自己的atoi()函数,并处理了一些边界情况,如空格、正负号、非数字字符和溢出。实现一个正确的atoi()函数可以让我们更好地处理一些特殊的需求。