C语言:模拟实现atoi函数

atio函数:

int atoi( const char *string );

这个函数返回一个整形的值,接收字符指针参数。

其主要功能为:提取出字符串中的第一段数字部分、数字之前的符号,并以整形的方式返回给程序。

例:

输入字符串:" 231asds"

返回: "231"

输入字符串:" -9864"

返回: "-9864"

输入字符串:"123 456"

返回:"123"

  •         这道题库函数atoi给出的实现是无法跳过数字之前的字母的,如果输入:"as123",那么返回值将为0。
  •         超出int类型大小时,atoi函数不做超长判断,如果输入"4564656565465465", 那么返回值将返回一个比他小的数字。

考虑到这两点,我做实现的时候可以做一下优化。

        思路:跳过所有不是数字的字符,当找到第一个数字停下,判断该数字的前一位是否是负号,如果是负号,则计算结果时乘 -1,否则不做变化。

        设置临时变量ret 初值为0,在刚才找到的第一个数字字符处,将值赋给临时变量ret,注意一点是:ret在这个循环中先乘法后加法,先进行加法会使给出的结果错误。

        字符转换为数字时,是以ASCII码的形式转换,所以需要减去 '0' 即 48 才能得到正确的数字。

#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
#include

int MyAtoi(const char *string)
{
	assert(string != NULL);

	int flag = 1;
	while (!isdigit(*string))	//跳过不是数字的字符
	{
		string++;
	}
	if (*(string - 1) == '-')	//查看数字前是否有负号
		flag *= -1;

	long long ret = 0;

	while (isdigit(*string))	//遍历字符串,将数字写入ret中
	{
		ret *= 10;
        //这里字符转化为数字时为ASCII码值,需要减掉字符'0'得到数字值
		ret += *string - '0';	
	
		if (ret > INT_MAX || ret < INT_MIN)	//ret超过int范围则返回0
			return 0;

		string++;
	}

	if (ret)
		return flag * (int)ret;
	else
		return 0;
}

void text()
{
	//模拟实现atoi函数:
	//int atoi( const char *string );
	char *c = "asds -1123322";
	int num = 0;
	num = MyAtoi(c);
	//num = atoi(c);
	printf("%s, %d\n", c, num);
	return ;
}

主要知识:isdigit函数的使用,INT_MAX,INT_MIN 常量的使用。

你可能感兴趣的:(C语言,c语言)