自己写一个atoi程序

最主要的是要考虑输入条件,程序写出来了远不是面试官的目的。各种异常情况的处理、边界条件的处理,才是面试官主要考察的内容。

我所能想到的测试用例有:

1,字符串内含有非法字符,非法字符的定义为0-9,- 之外的所有字符

2,字符串表示负数

3,字符串表示的整数溢出


以下是我写的myatoi和UT

#include <string.h>
int myatoi(const char* a);

void TestString(const char* str)
{
	printf("%s = %d\r\n", str, myatoi(str));    
}
void Test()
{
	const char* test[] = {"0", "0x1","-","01", "-1","1","123","1000000000","-1000000000","100000000000","-100000000000"};
	for(int i = 0; i < sizeof(test) / sizeof(const char*); i++)
	{
		TestString(test[i]);
	}
}

int myatoi(const char* a)
{
	if(a == NULL || strlen(a) == 0)
	{
		printf("empty string!\r\n");
		return 0;
	}

	int t = a[0];
	int i = 0;
	if(t > '9' || t < '0')
	{
		if(t != '-')
		{
			printf("illegal char!\r\n");
			return 0;
		}
		else if(strlen(a) < 2)
		{
			printf("illegal char!\r\n");
			return 0;
		}
		else
		{
			i = 1;
		}
	}

	for(; i < strlen(a); i++)
	{
		if((a[i] > '9' || a[i] < '0'))
		{
			printf("illegal char!\r\n");
			return 0;
		}
	}
	int sign = 1;
	int pos = 0;
	if(a[0] == '-')
	{
		sign = -1;
		pos++;
	}
	int n = 0;
	while(pos < strlen(a))
	{
		if(n * 10 / 10 != n)
		{
			printf("overflow!\r\n");
			return 0;
		}
		n = n * 10 + (a[pos++] - '0');
	}
	return n * sign;
}

写完了以后总觉得不爽,看了看cplusplus上对atoi函数的定义,感觉这个C函数的声明本身就有问题。异常条件下返回0,这种异常处理方式很容易导致客户程序员犯下很难debug到的错误。感觉如果定义为 bool atoi(const char* a, int& i)会比较稳定。


 

 

 

<think>好的,我现在需要帮助用户学习如何用C语言实现自定义的atoi函数。首先,我得回忆一下atoi函数的基本功能,它是将字符串转换为整数。用户已经提供了几个参考引用,里面有不同的实现方法,我需要综合这些信息,给出一个清晰的步骤说明。 首先,标准atoi函数的行为需要明确。根据引用[2]和[3],atoi处理的情况包括正负号、数字字符转换,以及遇到非数字字符时停止处理。比如,字符串"-123"应该转换为-123,而"123a45"则转换为123。同时,还需要处理像空字符串或无效输入的情况,可能返回0。 接下来,我需要分析用户提供的各个引用中的代码示例。引用[1]中的实现比较简单,没有处理符号和非法字符,直接转换数字部分。而引用[3]和[5]中的代码则考虑了正负号,并且在遇到非数字字符时停止转换。引用[4]的示例同样没有处理符号,但结构清晰。用户的需求是实现一个自定义版本,因此需要综合这些实现,覆盖更多的情况。 然后,我应该分步骤来讲解实现过程。第一步可能需要处理空指针和空字符串,避免程序崩溃。第二步处理空格,虽然标准atoi可能不会处理,但有些实现会跳过前面的空格。不过根据引用中的例子,用户提供的代码可能没有处理空格,所以需要决定是否包含这一步。第三步处理正负号,引用[3]中的代码用了一个标记nagtive,并在最后调整符号。第四步是转换数字,同时处理溢出问题,但引用中的例子大多没有处理溢出,可能用户的需求不需要太复杂,但应该提到这一点。 在代码示例部分,需要给出一个完整的实现,包含处理符号、数字转换,以及基本的错误处理。例如,当字符串为空或没有数字时返回0。同时,需要解释每一部分代码的作用,比如循环遍历每个字符,检查是否为数字,并累积结果。 另外,用户可能关心如何测试这个函数,引用[3]中提供了多个测试用例,包括正数、负数、含有非数字字符的情况。因此,在相关问题中,可以建议用户编测试用例来验证各种情况。 最后,要确保回答结构清晰,步骤明确,代码正确,并指出可能的局限性和改进方向,比如溢出处理。这样用户能够逐步理解实现过程,并自行扩展功能。</think># C语言自定义atoi函数实现详解 ## 一、atoi函数核心原理 atoi函数的核心是通过ASCII码转换实现字符串到整数的转换,核心公式为: $$n = n \times 10 + (char - '0')$$ 其中$char$表示当前字符的ASCII码值[^1][^4] ## 二、分步骤实现方案 ### 步骤1:基础框架搭建 ```c #include <stdio.h> int my_atoi(const char *str) { int sign = 1; // 符号标记 int result = 0; // 后续步骤在此添加代码 return result * sign; } ``` ### 步骤2:处理前置空格和符号 ```c // 跳过空白字符 while (*str == ' ' || (*str >= '\t' && *str <= '\r')) { str++; } // 处理正负号 if (*str == '-') { sign = -1; str++; } else if (*str == '+') { str++; } ``` ### 步骤3:字符转换处理 ```c while (*str >= '0' && *str <= '9') { result = result * 10 + (*str - '0'); str++; } ``` ### 步骤4:完整实现代码 ```c int my_atoi(const char *str) { if (str == NULL) return 0; // 处理空指针 int sign = 1; int result = 0; // 跳过前导空格 while (*str == ' ' || (*str >= '\t' && *str <= '\r')) { str++; } // 处理符号位 if (*str == '-') { sign = -1; str++; } else if (*str == '+') { str++; } // 转换数字部分 while (*str >= '0' && *str <= '9') { result = result * 10 + (*str - '0'); str++; } return result * sign; } ``` ## 三、关键点说明 1. **符号处理**:通过sign变量记录正负值,遇到'-'时设置sign=-1[^3] 2. **字符验证**:仅处理0-9范围内的ASCII字符[^4] 3. **空指针检查**:防止程序崩溃的防御性编程[^5] 4. **空白符跳过**:兼容标准库函数的处理方式[^3] ## 四、测试用例示例 ```c int main() { printf("%d\n", my_atoi("12345")); // 12345 printf("%d\n", my_atoi("-678")); // -678 printf("%d\n", my_atoi("+90a12")); // 90 printf("%d\n", my_atoi("abc123")); // 0 printf("%d\n", my_atoi(NULL)); // 0 return 0; } ``` ## 五、局限性说明 1. 未处理整数溢出(标准库行为是未定义) 2. 不处理科学计数法(如"1e5") 3. 非数字后缀会被忽略(如"123abc"返回123)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值