什么是atoi函数?
把字符串转换成整型数的一个函数。
那现在我们来实现如何构造出这个函数
1.首先创建出主函数和自定义函数 int main(){ char ch[] ="1234"; return 0;}我们如何去实现将字符串1234转换成整形呢?
我们这里引入了一个my_atoi的自定义函数。
并且为了对于ch数组和数组指针加上const使代码更为健壮。
int my_atoi(const char* s){ }int main(){const char* p = "1234";int ret = my_atoi(p); return 0;} 2. 那接下来我们要在my_atoi函数中写什么呢? 2.1 我们要进行对传入来的字符串的判断。(1)是否传来的字符串为空字符串?
(2)是否传来的为空指针?
(3)传来的字符串是否只有数字字符?
(4)对于转换数字的正负判断
对于这类问题我们要一一讨论
因此我们的my_atoi函数可以添加如下内容
int my_atoi(const char* s){int flag;//assert(s != NULL);if (s == NULL)return 0;if (*s == ' ')return 0;//跳过空白字符while (isspace(*s))//是空白字符返回非0值 非空白字符不进入{s++;}//处理+-if (*s == '+'){flag = 1;s++;}else if (*s == '-'){flag = -1;s++;}}
2.2 那我们是如何判断接下来的字符都是数字字符呢?
我们引入了一个新的函数 - isdigit,通过此函数可以判断是否为数字字符,那接下来我们就要进行如何将一个数字字符转换称一个十进制数字。
那写到了这里我们已经斩断了几乎所有的困难,那接下来我们需要写出我们的主要步骤 - 把字符串转换成数字。
2.3 如何把数字字符转换称数字
首先我们可以通过观看ASCII表可以看出字符1-9与数字1-9的关系
可以得知当'9'-'0'=9、'8'-'0'=8,可以推出数字字符等于数字加上'0'的ASCII。
因此我们的代码可以如下图所示
while (isdigit(*s)){n = n * 10 + (*s - '0') * flag;if (n > INT_MAX || n < INT_MIN){return 0;}s++;}我们的基本代码就写出来了,但如果考虑数字字符以后有着其他字符呢?
我们可以引入一个全局变量来定义是否合法转化
enum state{INVALID, //0VALID //1};enum state STATE = INVALID;//记录是合法访问的值还是非法访问的值然后对数字字符后位进行判断
//非数字字符或 if (*s == ' ') { STATE = VALID; return n; } else//非数字字符 { STATE = INVALID; return n; } }通过对后位的判断来决定是否为合法转化。
最后请看整理出的代码:
enum state{INVALID, //0VALID //1};enum state STATE = INVALID;//记录是合法访问的值还是非法访问的值int my_atoi(const char* s){int flag;//assert(s != NULL);if (s == NULL)return 0;if (*s == ' ')return 0;//跳过空白字符while (isspace(*s))//是空白字符返回非0值 非空白字符不进入{s++;}//处理+-if (*s == '+'){flag = 1;s++;}else if (*s == '-'){flag = -1;s++;}//处理数字字符的转换long long n = 0;while (isdigit(*s)){n = n * 10 + (*s - '0') * flag;if (n > INT_MAX || n < INT_MIN){return 0;}s++;}//非数字字符或 if (*s == ' '){STATE = VALID;return intn;}else//非数字字符{STATE = INVALID;return intn;} }#include<string.h>int main(){const char* p = "1234";int ret = my_atoi(p);if (STATE == VALID)printf("合法的转换:%d", ret);elseprintf("非法的转换:%d", ret);return 0;}谢谢观看!