目录
atoi函数
atof函数
模拟实现atoi,atof函数
1、atoi模拟实现
2、atof模拟实现
3、测试案例代码
atoi函数
atoi函数是将字符串转换成整数
函数头文件:
#include <stdlib.h>
函数原型:
int atoi(const char *str);
参数:str:要转换为整数的字符串
返回值:该函数返回转换后的长整数,如果没有执行有效的转换,则返回零
1、该函数首先会丢弃尽可能多的空白字符,直到找到第一个非空白字符,然后,从这个字符开始,取一个可选的初识加号或者减号,后跟尽可能多的十进制数字,并将他们返回一个int类型的数值。
2、若该字符串是在整数的字符后包含其他字符,则这些字符将会被忽略,返回其他字符之前的整数,并且不会对该函数造成任何影响。
3、若该字符串中第一个非空字符序列表示有效的整数,或是一个空指针,或只包含空白字符,则不执行任何转换,并且返回零。
测试案例代码如下:
int main(void)
{
int val = 0;
char str[20] = { 0 };
strcpy(str, "20230908");
val = atoi(str);
printf("字符串值 = %s, 整型值 = %d\n", str, val);
strcpy(str, "sakura");
val = atoi(str);
printf("字符串值 = %s, 整型值 = %d\n", str, val);
return(0);
}
atof函数
C 库函数atof把参数 str 所指向的字符串转换为一个浮点数(类型为 double 型)。
函数头文件:
#include <stdlib.h>
函数原型:
double atof(const char *str);
参数:str:要转换为浮点数的字符串。
返回值:函数返回转换后的双精度浮点数,如果没有执行有效的转换,则返回零(0.0)。
atof()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时(’\0’)才结束转换,并将结果返回,str字符串可包含正负号、小数点或E(e)来表示指数部分。
测试案例代码如下:
int main(void)
{
float val;
char str[20];
strcpy(str,"20230908");
val = atof(str);
printf("字符串值 = %s, 浮点值 = %f\n", str, val);
strcpy(str, "sakura");
val = atof(str);
printf("字符串值 = %s, 浮点值 = %f\n", str, val);
return(0);
}
模拟实现atoi,atof函数
1、atoi模拟实现
#include<assert.h>
#include<limits.h>
#include<ctype.h>
/*
特殊情况
1前面有一大堆空格
2传过来空指针
3字符串长度为0
4整形溢出
5含有其它字符
*/
enum state
{
Value,
ErrValue,
};
enum state statue = ErrValue;
int my_atoi(const char* str)
{
assert(str);
char* p = (char*)str;
long long n = 0;
int flag = 1;
//字符串长度为0
if (*str == '\0')
{
return 0;
}
//字符串前面有很多空格
while (*p == ' ')
{
p++;
}
//判断符号
if (*p == '+')
{
flag = 1;
p++;
}
else if (*p == '-')
{
flag = -1;
p++;
}
//开始计算
while (*p != '\0')
{
if (isdigit(*p))
{
n = n * 10 + flag * (*p - '0');
if (n > INT_MAX)
{
n = INT_MAX;
break;
}
else if (n < INT_MIN)
{
n = INT_MIN;
break;
}
}
else
{
break;
}
p++;
}
if (*p == '\0')
{
statue = Value;
}
return (int)n;
}
2、atof模拟实现
double my_atof(char* p)
{
//要记录小数点后的位数,方便最后计算浮点数。
int count = 0;
int flags = 1;
double a = 0.0;
double ret = 0.0;
assert(p);
while (isspace(*p)) //判断空格
{
p++;
}
while (*p)
{
if (count)//count初值0,遇到.后count++就开始计算小数点后的位数
count *= 10;
if (*p == '+')
p++;
else if (*p == '-')
{
flags = -1;
p++;
}
else if (*p == '.')
{
count++;
p++;
}
else if (*p >= '0' && *p <= '9')
{
ret = (ret * 10 + *p - '0');
p++;
}
else
return 0;
}
return ret / count;
}
3、测试案例代码
int main()
{
char arr[] = "12345678";
int m = my_atoi(arr);
if (statue == Value)
{
printf("%d\n", m);
}
if (statue == ErrValue)
{
printf("非法转化\n");
}
return 0;
}