【C语言】atoi字符串转整型函数仿写

(一)使用的头文件

stdio.h ctype.h

(二)atoi函数功能

该函数声明在string.h头文件中,用于将字符串转换成整型数据

(三)思路

要实现该函数,我们需要尽可能的考虑到用户输入数据的各种情况,所谓具有一定的健壮性。
可能出现的情况如下:整型、浮点型、正负数、八进制数、带有非法符号的、八进制数、十六进制数等情况

		"1243",		
		"a12.43",	
		"+12.45",	
		" -12.45",	
		"0123 45656",	
		"-078",	
		" qef21",
		"0x123aBfbx"

(四)编程步骤:

(1)去除字符串开头的空格符(空格 0x20、水平制表符 0x09 )
(2)判断正数负数,去除正负号
(3)判断进制,分类调用进制对应下的转换函数

(五)代码实现

#include <stdio.h>
#include <ctype.h>

//字符串转整型

//十进制
int atoi_Dec(const char* src)
{
    
    
	if (src == NULL) return 0;
	int sum = 0;
	while (*src != '\0' && isdigit(*src))
	{
    
    
		sum = sum * 10 + *src - '0';
		src++;
	}

	return sum;
}

//八进制
int atoi_Oct(const char* src)
{
    
    
	if (src == NULL) return 0;
	int sum = 0;
	while (*src != '\0' && isdigit(*src) && *src != '8' && *src != '9')
	{
    
    
		sum = sum * 8 + *src - '0';
		src++;
	}

	return sum;
}
//十六进制
int atoi_Hex(const char* src)
{
    
    
	if (src == NULL) return 0;
	int sum = 0;
	
	while (*src != '\0' && isxdigit(*src))
	{
    
    	
		char ch = 0;
		//123aBfbx
		//把所有的A~F转成小写
		if (isdigit(*src))
		{
    
    
			ch = *src - '0';
		}
		else
		{
    
    
			ch = tolower(*src) - 'a' + 10;
		}
		sum = sum * 16 + ch;
		src++;
	}

	return sum;
}

int my_atoi(const char* src)
{
    
    
	if (src == NULL)
		return 0;

	//标记正负数: -1是负数,1是正数,默认正数
	int flag = 1;
	int token = 0;	//记录返回值
	//去掉开头空格字符,src指向第一个有效数
	while (isblank(*src))
	{
    
    
		src++;
	}
	//判断是否是负数
	if (*src == '-')
	{
    
    
		flag = -1;	
		src++;
	}
	if (*src == '+')
	{
    
    
		src++;
	}
	
	//判断进制
	if (*src == '0')	
	{
    
    
		//十六进制
		if (*(src + 1) == 'x' || *(src + 1) == 'X')
		{
    
    
			token = atoi_Hex(src + 2);
		}
		else      //八进制
		{
    
    
			token = atoi_Oct(src + 1);
		}
	}
	else          //十进制
	{
    
    
		token = atoi_Dec(src);
	}
	if (flag == -1)
	{
    
    
		token = -token;
	}
	return token;
}


int main()
{
    
    
	const char* str[] =
	{
    
    
		"1243",		
		"a12.43",	
		"+12.45",	
		" -12.45",	
		"0123 45656",	
		"-078",	
		" qef21",
		"0x123aBfbx"	
	};

	int count = sizeof(str) / sizeof(str[0]);
	for (int i = 0; i < count; i++)
	{
    
    
		printf("%s:%d\n", str[i], my_atoi(str[i]));
	}
	return 0;
}

(六)结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/xiaoxiaoguailou/article/details/121309763