目录
int atoi (const char * str);


- int main() {
- char arr[] = " 1234a000";
- int i = atoi(arr);
- printf("%d", i);
-
- return 0;
- }

int atoi (const char * str);
- //空指针
- assert(str);
- //空字符串
- if (*str == '\0')
- return 0;
- //跳过空白字符
- //例如:“ 12345”,跳过前面的空格
- while (isspace(*str)) {
- str++;
- }
- //flag:+ - 来表示
- int flag = 1;//1表示正号,-1表示负号
- if (*str == '+') {
- flag = 1;
- str++;
- }
- else if (*str == '-') {
- flag = -1;
- str++;
- }
- //为了方便
- long long r = 0;//因为r可能会超过INT_MAX或者低于INT_MIN,所以要想将r设置为long long类型
- while (*str) {
- //判断是否为数字字符
- if (isdigit(*str)) {
- //数字字符在字符表中都是按顺序排放的,所以‘1’-‘0’= 1
- //r * 10是为了保证前一位能进一位,例如字符串“12”,为了保证1到十位,所以要乘以10
- r = r * 10 + flag * (*str - '0');
- if (r > INT_MAX || r < INT_MIN) {
- if (flag == 1)//判断正负号
- return INT_MAX;
- else
- return INT_MIN;
- }
- str++;
- }
- else {
- return (int)r;
- }
- }
- enum State
- {
- VALID,//0
- INVALID//1
- }sta = INVALID;//默认设置为非法
- enum State
- {
- VALID,//0
- INVALID//1
- }sta = INVALID;//默认设置为非法
- int my_atoi(const char* str) {
- //空指针
- assert(str);
- //空字符串
- if (*str == '\0')
- return 0;
- //跳过空白字符
- //例如:“ 12345”,跳过前面的空格
- while (isspace(*str)) {
- str++;
- }
- //flag:+ - 来表示
- int flag = 1;//1表示正号,-1表示负号
- if (*str == '+') {
- flag = 1;
- str++;
- }
- else if (*str == '-') {
- flag = -1;
- str++;
- }
- //为了方便
- long long r = 0;//因为r可能会超过INT_MAX或者低于INT_MIN,所以要想将r设置为long long类型
- while (*str) {
- //判断是否为数字字符
- if (isdigit(*str)) {
- //数字字符在字符表中都是按顺序排放的,所以‘1’-‘0’= 1
- //r * 10是为了保证前一位能进一位,例如字符串“12”,为了保证1到十位,所以要乘以10
- r = r * 10 + flag * (*str - '0');
- if (r > INT_MAX || r < INT_MIN) {
- if (flag == 1)//判断正负号
- return INT_MAX;
- else
- return INT_MIN;
- }
- str++;
- }
- else {
- return (int)r;
- }
- }
- sta = VALID;
- return (int)r;
- }
-
- int main() {
- char arr[] = " 1234a0000000000000000000000";
-
- int ret = my_atoi(arr);
- if (sta == VALID)
- printf("合法的转换:%d\n", ret);
- else
- printf("非法的转换:%d\n", ret);
-
- }
