【C语言】解题训练


目录


模拟实现atoi

#define相关题目

题目1

题目2

题目3

用宏交换奇偶位

实现offsetof宏


模拟实现atoi

int atoi( const char *string );

atoi的功能:把一个字符串转换为对应的整形。

#include <stdio.h>
#include <stdlib.h>
int main()
{
	int ret = atoi("123");
	printf("%d\n", ret);
    return 0;
}//123,由字符123\0得到数字123

简单思路:

举例字符串"123"
1. 得到一百二十三的每个数字:遍历字符串:"123\0",因为如果是字符1,"1"-"0"=1,即字符1-字符0=数字1,所以:
"1"-"0"=1
"2"-"0"=2
"3"-"0"=3
2. 得到数字一百二十三:让n从0开始:n=0
n=n*10+1得到1
n=n*10+2得到12
n=n*10+3得到123
代码实现:

#include <stdio.h>
int my_atoi(char* str)
{
	int n = 0;
	while (*str)//\0的ACSII码值为0,停下
	{
		//*str是字符1
		n = n * 10 + (*str - '0');
		str++;
	}
	return n;
}
int main()
{
	int ret = my_atoi("123");
	printf("%d\n", ret);//传的是首字符地址
	return 0;
}//123

上述是正常情况,只有一种,字符串处理到\0就结束正常转换为一个数字。

全面考虑——异常情况有:

1. 处理空指针:
若传的字符串为NULL,就不能对其解引用——需要断言
2. 处理空字符串
若传的是空字符串,不进入循环,返回n为0的值,那么返回的这个0是数字0还是空字符串0,形成歧义
3. 空白字符(字符串中有空格)
4. 正负数的问题
5. 字符串中有非数字字符,如"123abc"
6. 超大数字问题,如11111111111111111111111,一个整形是放不下的

注意:空白字符的情况:当字符串的前面有空格时,atoi()函数本身会把空格跳过去。

  • 16
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值