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)