C语言:库函数atoi及其模拟实现

atoi:

atof是C语言标准库中的一个函数,用于将字符串转换为对应的浮点数/整形数。

 

函数接受一个参数str,该参数是一个指向以null结尾的字符串的指针。atof函数会尝试将这个字符串转换为一个浮点数,并返回转换后的结果。

要注意的是,atof函数在进行转换时会自动识别字符串中的浮点数表示形式,包括小数点、指数符号等。它会跳过字符串中的空格字符,直到遇到数字或者正负号。

如果无法进行有效的转换,atof函数会返回0.0作为转换结果。

#include <stdio.h>
#include <stdlib.h>

int main()
{
	int ret1 = atoi("12345");
	double ret2 = atof("3.1415926");

	printf("%d\n", ret1);
	printf("%f\n", ret2);

	return 0;
}

模拟实现atoi函数

模拟实现时应防止读取空字符串,跳过空白字符串,处理正负号问题

#include <stdio.h>
#include <ctype.h>
#include <assert.h>
#include <limits.h>
enum State
{
	VALID,
	INVALID
}state=INVALID;// 全局的状态,它的标志返回的合法的值还是异常的值
//对state初始化为INVAKID表示为非法访问

int my_atoi(const char* str)
{
	int flag = 1;
	assert(str);

	//空字符串
	if (*str == '\0')
		return 0;

	//跳过空白字符
	while (isspace(*str))
		str++;

	//处理正负号问题
	if (*str == '-')
	{
		flag = -1;
		str++;
	}
	else if (*str == '+')
	{
		str++;
	}

	long long ret = 0;
	while (*str != '\0')
	{
		if (isdigit(*str))//判断该位是否为非0
		{
			ret = ret * 10 + flag * (*str - '0');

			//防止访问数目过大
			if (ret<INT_MIN || ret>INT_MAX)
			{
				return 0;
			}
		}
		else
		{
			return (int)ret;
		}
		str++;
	}
	state = VALID;
	return (int)ret;
}

int main()
{
	int ret = my_atoi("-25");
	if (state == VALID)
		printf("%d\n",ret);
	else
		printf("非法访问:%d", ret);

	return 0;
}

模拟实现中使用到的库函数:

1.isspace

isspace是C语言标准库中的一个函数,用于判断一个字符是否为空白字符。

空白字符包括空格、制表符、换行符、回车符等字符。isspace函数的原型如下:

int isspace(int c);

函数接受一个整数值(通常是字符的ASCII码)作为参数,并返回一个非零值(真)或零(假)。具体而言:

  • 如果参数c是一个空白字符,函数返回非零值,表示真。
  • 如果参数c不是一个空白字符,函数返回零,表示假。

isspace函数常用于判断一个字符是否为空白,可以在循环中使用它来处理文本字符串中的空白字符,或者判断用户输入是否为有效的空白字符。

2.isdigit

isdigit 是C语言标准库中的一个函数,用于判断一个字符是否为数字字符。它的原型如下:

int isdigit(int c);

isdigit 函数接受一个整数参数(通常是字符的ASCII码),并返回一个非零值(真)或零(假)。

具体而言:

  • 如果参数c是一个数字字符(0-9),函数返回非零值,表示真。
  • 如果参数c不是一个数字字符,函数返回零,表示假。

以下是一个示例代码,演示了如何使用 isdigit 函数判断一个字符是否是数字字符:

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

int main() {
    char ch = '5';
    
    if (isdigit(ch)) {
        printf("'%c' 是一个数字字符\n", ch);
    } else {
        printf("'%c' 不是一个数字字符\n", ch);
    }
    
    return 0;
}

输出:

'5' 是一个数字字符

注意:isdigit 是C标准库中的函数,如果在C++中使用,应该包含头文件 <cctype>,并将函数名写作 std::isdigit

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值