atoi函数(c语言)

目录        

                atoi函数的说明

                函数改编以及思路

                代码

                代码注释 


  atoi函数的说明

该函数的作用是将一字符串变为一整型类型的数字输出出来,若字符串内无数字则输出0,此处输出按十进制输出。字符串开头的空格会自动扫描为空 ,

  函数改编以及思路

对该函数的实现我们进行深入一步的改变,若看懂了改变后的思路便可以轻松看懂该库函数的源码。

my_atoi函数:字符串转换为整型数字:

输入 输出
123 123
-123 -123
+123 123
++---123 -123
   -----123 -123
   123wef345 123
afeef123fwf35 0

 我们来分析上面表格:首先输入数字可以直接进行输出,前面为负号,则输出为负数,可以多输入正负号,我们通过负负得正的计算公式进行计算,紧接着若前面为空格,则无视空格,直接进行数字转换,若数字中间有其他字符,则直接输出字符前面的数字,字符串最前面是正负号和空格数字之外的其他字符,直接输出0;

通过以上分析,我们可以得到以下规律:

1)字符串最前面应该为数字,正负号,空格三个字符,其他均输出0;

2)数字前的正负号遵循负负得正的公式;

3)数字中不能存在其他字符,否则输出其他字符前面的数字;

思路:首先我们要直到字符串如何输出为整型数字——例如123这个数字,我们首先应该算出数字的位数,然后再算出数字,然后乘以10的长度减n次方,也就是进制转换 123=1*10^2+2*10^1+3*10^0;

解决了这个问题,我们分析正负号的问题,很显然我们根据负负得正的公式计算,不需要直到正号的个数,只需要算出负号的个数,如果负号为奇数个,则输出负号,若为偶数则直接输出数字,

然后我们看数字前后空格,其他字符类等问题,字符串刚开始前面只能是空格或者正负号和数字,但是数字有局限性,如果开始有数字那么后面字符串只要不是数字直接输出前面的数字,很显然,我么计算的正负号的个数是在数字之前的前提下进行计算。

代码:

#include
#include
#include
#define assert
#include

void getbit(char *arr, int *count1, int *count2){
	bool fase = true;)
	while (*arr == ' ' || isdigit(*arr)||*arr=='+'||*arr=='-'){
		if (isdigit(*arr)){
			while(isdigit(*arr)){
				(*count1)++;
				arr++;
				fase = false;
			}

		};
		if (!fase) break;
		if (*arr == '-')    (*count2)++;
		arr++;
	}
}
int atoi(char*arr){
	int count1 = 0,count2=0;
	int len = strlen(arr);

		if (isdigit(*arr) || *arr == '+' || *arr == '-' || *arr == ' ')
			getbit(arr, &count1,&count2);
		else return 0;
		int result = 0;
		while (*arr == ' ' || isdigit(*arr) || *arr == '+'||*arr=='-'){
			if (isdigit(*arr))  {
				while (isdigit(*arr)){
					result = result + ((*arr - '0')*(int)pow(10, (double)count1 - 1));
					count1--;
					arr++;
				}
				break;
			}
			arr++;
			
		}if (count2 & 1) return -1*result;
		else 	
		return result;

}
int main() {
		char arr[] = "  -545";
			int result = atoi(arr);
		  printf("%d\n", result);
}

代码讲解以及注释:

#include
#include
#include
#define assert
#include

void getbit(char *arr, int *count1, int *count2){//计算数字以及正负号的个数
	bool fase = true;//标记(在找到数据之后不能有其他字符,此为退出循环的标记)
	while (*arr == ' ' || isdigit(*arr)||*arr=='+'||*arr=='-'){//字符串刚开始的限制
		if (isdigit(*arr)){//找到第一个数字开始计算数字个数
			while(isdigit(*arr)){
				(*count1)++;
				arr++;
				fase = false;//有了这个标记,退出小循环之后便可以直接退出循环
			}

		};
		if (!fase) break;//找到数字之后,后面只要不是数字直接可以不用继续遍历
		if (*arr == '-')    (*count2)++;//计算数字之前负号的个数
		arr++;
	}
}
int atoi(char*arr){
	int count1 = 0,count2=0;//有效数字的个数
	int len = strlen(arr);

		if (isdigit(*arr) || *arr == '+' || *arr == '-' || *arr == ' ')//第一个字符的限制条件
			getbit(arr, &count1,&count2);//第一个字符是空格数字正负号才需要计算个数
		else return 0;
		int result = 0;//需要的整数值
		while (*arr == ' ' || isdigit(*arr) || *arr == '+'||*arr=='-'){
			if (isdigit(*arr))  {
				while (isdigit(*arr)){//同样找到数字开始进行计算数字的和
					result = result + ((*arr - '0')*(int)pow(10, (double)count1 - 1));
					count1--;//每次数字个数减一
					arr++;//指针移动(上面条件得到的是字符数字,需要减去字符0才是我们需要的结果)
				}
				break;//碰到非数字,循环结束,直接退出大循环
			}
			arr++;
			
		}if (count2 & 1) return -1*result;
		else 	
		return result;

}
int main() {
		char arr[] = "  -545";
			int result = atoi(arr);
		  printf("%d\n", result);
}

你可能感兴趣的:(习题,java,servlet,数据库)