我们先来看一看在标准库中的函数介绍:
解析C-string str,将其内容解释为整数,并返回为int类型的值。
看一下函数的具体细节:
该函数首先根据需要丢弃任意数量的空白字符(与isspace中一样)
,直到找到第一个非空白字符为止。然后,从这个字符开始,接
受一个可选的初始加号或减号,后面跟着尽可能多的基数为10的
数字,并将它们解释为数值。解析C-string str,将其内容解释为
整数,并返回为int类型的值。
字符串可以在组成整数的字符之后包含额外的字符,这些字符被
忽略,对函数的行为没有影响。
如果str中的第一个非空白字符序列不是有效的整数,或者由于str
为空或仅包含空白字符而不存在这样的序列,则不执行转换并返
回0。
我们可以总结出几个规律:
1.开头的空白字符自动跳过
2.可以识别符号位(正负号)
3.若出现非数字字符(‘0’到’9’),则忽略。
具体的实现:
int MyAtoi(const char *arr){
int sign = 1;//作为符号位的标记
long count = 0;//写一个长整型作为数据存储要转换的数据
if (arr == NULL){
//常规判空
return 0;
}
while (*arr == ' '){
//自动跳过开头的空白
arr++;
}
if (*arr == '-'){
//符号位为负数就先存下,正数就不用管
sign = -1;
arr++;
}
//在不越界的情况下找0-9的字符,并利用字符的ascii码
//将其直接转换为数字
while (*arr >= '0'&&*arr <= '9'&&*arr != '\0'){
count = count * 10 + (*arr - '0');
//count每次会自动增加位数,*10是为了它的下一位计数
arr++;
}
//返回符号*数字
return sign*count;
}
测试:
void test(){
char* arr = "123";
char* arr1 = " 123a";
char* arr2 = " 123a123";
char* arr3 = " -123";
char* arr4 = "a123";
printf("%d",MyAtoi(arr));
printf("%d", atoi(arr));
printf("\n");
printf("%d", MyAtoi(arr1));
printf("%d", atoi(arr1));
printf("\n");
printf("%d", MyAtoi(arr2));
printf("%d", atoi(arr2));
printf("\n");
printf("%d", MyAtoi(arr3));
printf("%d", atoi(arr3));
printf("\n");
printf("%d", MyAtoi(arr4));
printf("%d", atoi(arr4));
printf("\n");
}