介绍atoi函数
atoi
将数字字符串转化为整形
实例如下
#include<stdio.h> #include<stdlib.h> int main() { char ch[] = "123"; int i = atoi(ch); printf("%d\n", i); return 0; }
实现思路
如果在最理想状态下代码实现比较简单
#include<stdio.h> int my_atoi(const char* str) { int ret = 0; while (*str) { ret = ret * 10 + (*str - '0'); str++; } return ret; } int main() { char ch[] = "123"; int ret = my_atoi(ch); printf("%d\n", ret); return 0; }
需要考虑的极端情况
1. 空指针 2. 空字符串 3. 空格 4. +- 符号 5. 越界 6. 非数字字符
在考虑极端情况下,该如何实现次函数呢?
#include<stdio.h> #include<assert.h> #include<limits.h> #include<ctype.h> enum M { VALID, INVALID }m=INVALID;//默认返回值是无效的 int my_atoi(const char* str) { assert(str); int flag = 1; //如果是空字符串 if (*str == '\0') { return; } //跳过空白字符 while (isspace(*str)) { str++; } //判断符号的正负 if (*str == '+') { flag = 1; str++; } else if (*str == '-') { flag = -1; str++; } long long ret = 0; while (*str) { //判断是否为数字字符串 if (isdigit(*str)) { ret = ret * 10 + flag*(*str - '0'); //判断是否越界 if (ret > INT_MAX || ret < INT_MIN) { return; } } else { return (int)ret; } str++; } //当遇到字符串结尾的'\0'时正常返回 if (*str == '\0') { m = VALID; } return (int)ret; } int main() { char ch[] = "123adf"; int ret = my_atoi(ch); if (m == INVALID) { printf("无效返回:>%d\n", ret); } else if(m==VALID) { printf("有效返回:>%d\n", ret); } return 0; }
此次模拟实现虽然是成功啦,但还是有些没有考虑到的因素。待之后进行完善