atoi:
atof是C语言标准库中的一个函数,用于将字符串转换为对应的浮点数/整形数。
函数接受一个参数str,该参数是一个指向以null结尾的字符串的指针。atof函数会尝试将这个字符串转换为一个浮点数,并返回转换后的结果。
要注意的是,atof函数在进行转换时会自动识别字符串中的浮点数表示形式,包括小数点、指数符号等。它会跳过字符串中的空格字符,直到遇到数字或者正负号。
如果无法进行有效的转换,atof函数会返回0.0作为转换结果。
#include <stdio.h>
#include <stdlib.h>int main()
{int ret1 = atoi("12345");double ret2 = atof("3.1415926");printf("%d\n", ret1);printf("%f\n", ret2);return 0;
}
模拟实现atoi函数
模拟实现时应防止读取空字符串,跳过空白字符串,处理正负号问题
#include <stdio.h>
#include <ctype.h>
#include <assert.h>
#include <limits.h>
enum State
{VALID,INVALID
}state=INVALID;// 全局的状态,它的标志返回的合法的值还是异常的值
//对state初始化为INVAKID表示为非法访问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 == '+'){str++;}long long ret = 0;while (*str != '\0'){if (isdigit(*str))//判断该位是否为非0{ret = ret * 10 + flag * (*str - '0');//防止访问数目过大if (ret<INT_MIN || ret>INT_MAX){return 0;}}else{return (int)ret;}str++;}state = VALID;return (int)ret;
}int main()
{int ret = my_atoi("-25");if (state == VALID)printf("%d\n",ret);elseprintf("非法访问:%d", ret);return 0;
}
模拟实现中使用到的库函数:
1.isspace
isspace是C语言标准库中的一个函数,用于判断一个字符是否为空白字符。
空白字符包括空格、制表符、换行符、回车符等字符。isspace函数的原型如下:
int isspace(int c);
函数接受一个整数值(通常是字符的ASCII码)作为参数,并返回一个非零值(真)或零(假)。具体而言:
- 如果参数c是一个空白字符,函数返回非零值,表示真。
- 如果参数c不是一个空白字符,函数返回零,表示假。
isspace函数常用于判断一个字符是否为空白,可以在循环中使用它来处理文本字符串中的空白字符,或者判断用户输入是否为有效的空白字符。
2.isdigit
isdigit
是C语言标准库中的一个函数,用于判断一个字符是否为数字字符。它的原型如下:
int isdigit(int c);
isdigit
函数接受一个整数参数(通常是字符的ASCII码),并返回一个非零值(真)或零(假)。
具体而言:
- 如果参数c是一个数字字符(0-9),函数返回非零值,表示真。
- 如果参数c不是一个数字字符,函数返回零,表示假。
以下是一个示例代码,演示了如何使用 isdigit
函数判断一个字符是否是数字字符:
#include <stdio.h>
#include <ctype.h>int main() {char ch = '5';if (isdigit(ch)) {printf("'%c' 是一个数字字符\n", ch);} else {printf("'%c' 不是一个数字字符\n", ch);}return 0;
}
输出:
'5' 是一个数字字符
注意:isdigit
是C标准库中的函数,如果在C++中使用,应该包含头文件 <cctype>
,并将函数名写作 std::isdigit
。