【C语言】解题训练

本文介绍了C语言中模拟实现atoi函数的详细过程,包括异常情况处理,如空指针、空字符串、空白字符、正负数、非数字字符和超大数字。此外,还讲解了#define相关的题目,通过示例解析了宏替换和指针类型的理解。同时,文章探讨了如何用宏交换整数的奇偶位,并提供了实现offsetof宏的方法,帮助理解结构体成员相对于首地址的偏移量。
摘要由CSDN通过智能技术生成

目录


模拟实现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()函数本身会把空格跳过去。

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

一般不会考虑字符串中间有空格的问题。

#include <stdio.h>
#include <stdlib.h>
int main()
{
	int ret = atoi("12    3");
	printf("%d\n", ret);
	return 0;
}//12

即atoi()函数本身是不会处理这种空白字符的。

my_atoi()函数处理字符串的内容:是转换字符串的内容出来一个整数而不是改变这个字符串,所以加const修饰保护:const char* str,说明指针str指向的内容是不会修改的。

空字符串是没法转换的,是异常情况;若让空字符串返回0,但若是字符串"0"它返回的也是0,这是正常情况,这两种情况形成歧义。则需要区分这两种情况,my_atoi()函数就需要有正常情况和判断异常情况的状态。

注意:函数的功能尽可能的单一纯粹,如my_atoi()函数进行转换就可,不在这个函数中打印各种状态。
所以创建一个结构体类型表示状态。

#include <stdio.h>
#include <assert.h>
#include <ctype.h>
#include <stdlib.h>
enum State
{
	INVALID,//非法
	VALID//合法
};
//用这个结构体类型定义一个全局变量,这个变量用来表示状态
//因为异常情况较多,正常情
  • 16
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值