模拟实现atoi()—— C语言
库函数atoi(),将所指向的字符串转换为一个整数(类型为int型)
目录
1.库函数 atoi()
2.库函数 atoi()的实现
3.库函数atoi()的模拟实现
1.库函数 atoi()
声明
int atoi(const char *str)
参数 str -- 要转换为整数的字符串。
返回值 函数返回转换后的长整数,如果没有执行有效的转换,则返回零。
头文件
注意 atoi的规则是:跳过不可见字符,碰到负号或者数字开始转换,转换到非数字字符为止。
2.库函数 atoi()的实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int val;
char str[20];
strcpy(str, "989934896");
val = atoi(str);
printf("字符串值 = %s, 整型值 = %d\n", str, val);
strcpy(str, "123runoob.com");
val = atoi(str);
printf("字符串值 = %s, 整型值 = %d\n", str, val);
return(0);
}
3.库函数atoi()的模拟实现
int main()
{
char arr[20] = " -12a34";
int ret = my_atoi(arr);
printf("%d\n", ret);
return 0;
}
先把主函数函数写好,下面来考虑字符串出现的可能形式
字符串中可能出现:
1.数字形式的字符
2.空指针
3.空字符串
4.非数字字符
5.前面有空白字符
6.前面有+-
下面来实现
#include<assert.h>
#include<ctype.h>
#include<limits.h>
enum status
{
VALID,
INVALID
}status=INVALID;//非法
int my_atoi(const char* str)
{
int flag = 1;
//空指针
assert(str);
//字符串为空
if (*str == '\0')
{
return 0;
}
//空白字符
while (isspace(*str))
{
str++;
}
//正负号
if (*str == '+')
{
flag = 1;
str++;
}
else if(*str=='-')
{
flag = -1;
str++;
}
//数字字符
long long n = 0;
while (*str!='\0')
{
if (isdigit(*str))
{
n = n * 10 +flag*(* str - '0') ;//存放比整型更大的值
if (n<INT_MIN || n>INT_MAX)
{
n= 0;
break;
}
}
else
{
break;
}
str++;
}
if (*str == '\0')
{
status = VALID;
}
return (int)n;
}
int main()
{
char arr[20] = " -12a34";
int ret = my_atoi(arr);
if (status == VALID)
printf("合法转化:%d\n", ret);
else
{
printf("非法转化:%d\n", ret);
}
return 0;
}
还没有评论,来说两句吧...