【C语言】atoi函数的使用和模拟实现

1.atoi函数的使用

atoi函数的作用是将字符串转换成整数,它所包含的头文件是stdlib.h。

我们来举个例子感受一下atoi函数:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int main()
{
	char* str = "123";
	int i = atoi(str);
	printf("%d", i);
}

2.atoi函数的模拟实现

要想完成atoi函数的模拟实现,就要考虑到可能会输入的几种特殊情况:

1.遇到正负号:

char* str = "-123";

观察结果发现正负号是可以正常输出的。

2.打印的字符串中含有空格。

这时候,我们还要分两种情况

a.开头遇到了空格。

char* str = "      -123";

观察运行结果,字符串是跳过开头的空格直接将数字打印出来的。

b.在字符串中间遇到了空格。

char* str = "-12      3";

观察运行结果,发现在字符串中间遇到空格的话,会直接停止打印,同时将空格前面的数字打印出来。

3.在字符串当中遇到非数字的字符。

char* str = "12sgahvh3";

观察运行结构,发现在字符串当中遇到非数字的字符会直接停止打印,将非数字的字符前面的数字打印出来。

4.使用atoi函数打印出来的数字大于INT_MAX,或者小于INT_MIN。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int main()
{
	char* str1 = "100000000000000";
	char* str2 = "-100000000000000";
	int i = atoi(str1);
	int j = atoi(str2);
	printf("%d\n", i);
	printf("%d\n", j);
}

观察运行结果,发现如果使用atoi函数打印出来的数字大于INT_MAX,或者小于INT_MIN,结果会直接输出INT_MAX或者INT_MIN。

考虑完以上这几种特殊情况,就来开始着手atoi函数的模拟实现:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
enum State
{
	VAILD,//合法转换
	INVAILD//非法转换
}state= INVAILD;
int MyAtoi(char* Str)
{
	assert(Str);
	if (*Str == '\0')
		return 0;
	while (*Str == ' ')
		Str++;
	int flag = 1;
	double num = 0;
	//此处必须设成double类型,否则如果num的值大于INT_MAX或者小于INT_MIN的话,
	//就会因为int类型存不下那么大的值而直接变成乱值
	int count = 0;
	if (*Str == '+')
	{
		Str++;
	}
	if (*Str == '-')
	{
		flag = -1;
		Str++;
	}
	while (*Str >= '0' && *Str <= '9')
	{
		count = *Str - '0';
		num = num * 10 + count;
		if (num > INT_MAX)
			num = INT_MAX;
		if (num < INT_MIN)
			num = INT_MIN;
		Str++;
	}
	num = num * flag;
	if (*Str == '\0')
		state = VAILD;
	return (int)num;
}
int main()
{
	char* str = "-123000f";
	int i = MyAtoi(str);
	if (state == VAILD)
		printf("合法转换:%d\n", i);
	else
		printf("非法转换:%d\n", i);
	return 0;
}

  • 11
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值