还是把cplusplus的网址给大家放在这里啦!
一、atoi函数说明
函数总结:
- 字符串解析:函数首先跳过所有空白字符,直到找到第一个非空白字符。
- 符号处理:从非空白字符开始,函数可以识别一个可选的正号或负号。
- 数字解析:然后,它会读取尽可能多的基于10的数字,并将其解释为数值。
- 忽略额外字符:如果字符串中的数字后面还有其他字符,这些字符将被忽略,不影响函数的行为。
- 无效输入处理:如果字符串的第一个非空白字符序列不是有效的整数,或者由于字符串为空或只包含空白字符而没有这样的序列,则不执行转换,返回0。
- 参数:函数接受一个参数
str
,这是一个以整数表示形式开始的 C 字符串。 - 返回值:成功时,返回转换后的整数值。如果转换的值超出了
int
类型可表示的范围,将导致未定义行为。 - 健壮性问题:如果存在值超出
int
范围的可能性,使用atoi
可能会引起问题。在这种情况下,使用strtol
作为更健壮的跨平台替代方案可能是更好的选择。
使用 atoi
函数时,开发者应该意识到它可能不会处理所有边界情况,特别是在处理非常大的数值时。因此,对于需要更健壮数值转换的应用程序,考虑使用其他函数,如 strtol
,可能是更安全的选择。
二、atoi函数使用
int main() {
// 定义一个字符串,表示一个整数
const char* str = " -1234 ";
// 使用 atoi 函数将字符串转换为整数
int number = atoi(str);
// 打印转换后的整数
printf("The integer is: %d\n", number);
return 0;
}
三、atoi模拟实现
#include <stdio.h>
#include <ctype.h> // 为isspace函数
int my_atoi(const char* str)
{
int result = 0;
int sign = 1;
int i = 0;
while (isspace((unsigned char)str[i]))
i++;
if (str[i] == '+' || str[i] == '-')
{
sign = (str[i] == '-') ? -1 : 1;
i++;
}
while (isdigit((unsigned char)str[i]))
{
result = result * 10 + (str[i] - '0');
i++;
}
return result * sign;
}
int main()
{
const char* str = " -82";
printf("%d\n", my_atoi(str));
return 0;
}
代码详解:
-
定义
my_atoi
函数:int my_atoi(const char* str)
:定义了一个名为my_atoi
的函数,接收一个指向常量字符的指针str
作为参数。
-
初始化变量:
int result = 0;
:初始化结果变量result
为 0。int sign = 1;
:初始化符号变量sign
为 1,表示正数。int i = 0;
:初始化索引变量i
为 0,用于遍历字符串。
-
跳过空白字符:
while (isspace((unsigned char)str[i])) i++;
:使用isspace
函数跳过字符串开头的所有空白字符。(unsigned char)
强制转换确保字符处理是按无符号类型进行。
-
处理符号:
if (str[i] == '+' || str[i] == '-')
:检查当前字符是否是正号或负号。sign = (str[i] == '-') ? -1 : 1;
:如果当前字符是负号,sign
变为 -1,否则保持 1。i++;
:无论当前字符是正号还是负号,都将其后的索引i
加一,以跳过这个符号。
-
转换数字:
while (isdigit((unsigned char)str[i]))
:循环直到遇到非数字字符。isdigit
函数检查当前字符是否为数字。result = result * 10 + (str[i] - '0');
:将当前字符转换为对应的整数值,并加到结果上。这是通过将字符的 ASCII 值减去字符 '0' 的 ASCII 值来实现的。i++;
:移动到下一个字符。
-
返回结果:
return result * sign;
:返回最终的结果,乘以之前确定的符号。