函数补充与常见例题分析(杂例补充)

📅 2026/7/24 22:36:24 👁️ 阅读次数 📝 编程学习
函数补充与常见例题分析(杂例补充)

目录

一,atoi函数

二,isspace函数

三,isdigit函数

四,例题:

1,序列中删除指定数字

2,数组串联

3,offsetof宏的实现

4,交换奇偶位


一,atoi函数

头文件:#include <stdlib.h>

核心功能:将字符串转化为整形(int)

语法:int atoi(const char* str)

str为以'\0'结尾的要转化的字符串

如果无法有效转化就会返回0

转化特点:

1,如果遇到空格就跳过

2,可以识别正负号:正号不显示,负号显示

3,当遇到字母字符时会直接停止,当字符串中的所有数字都在字母字符后时,会直接返回0

4,遇到超出int范围的值时,大于返回int的最大值,小于返回int的最小值

注意:

当字符串中有浮点数时,atoi只会转化整数部分小数部分会直接忽略。

运用展示:

当字符串为" a+1234" 时打印0

当为" -12a34"时打印-12

当为" -12.34"时打印-12

1.模拟实现atoi函数

二,isspace函数

头文件:#include <ctype.h>

核心功能:检查字符是否空白字符

语法:int isspace(int c)

当是空白字符时返回一个非零数

当不是空白字符时返回0

C语言中的空白字符有以下几种:

三,isdigit函数

核心功能:判断字符是不是‘0’~‘9’的数字字符

头文件:#include <ctype.h>

语法:int isdigit(int c)

c为要传入的字符的ASCII码值,范围:0<=c<=255或EOF(-1)

返回值:当是‘0’~‘9’的数字字符时返回一个非零值

如果不是则返回0

用int来接收字符的原因:

1,支持文件结束符EOF(-1)

2,函数内部实现的需要

四,例题:

1,序列中删除指定数字

#include <stdio.h> int main() { int n = 0; scanf("%d",&n); //把整数输入到数组中 int arr[50] = {0};//50为最大容量 int i = 0; for(i=0;i<n;i++) { scanf("%d ",&arr[i]); } //删除值 int del = 0; scanf("%d",&del); //重排序-两个变量记录下标 int a = 0; int b = 0; for(a=0;a<n;a++) { if(arr[a]!=del) { arr[b] =arr[a]; b++; } } int k = 0; for(k=0;k<b;k++) { printf("%d ",arr[k]); } return 0; }

分析关键内容:在于最后的重新排序

上述最后的循环次序是不可更改的

在a到达要删除的数字前,b先到达,再通过判断,让a停下,在b变大前,将a处的值传给b,实现序列的更改。

2,数组串联

3,offsetof宏的实现

头文件:#include <stddef.h>

核心功能:计算结构体成员相对于首地址的偏移量

实现:#define offsetof(s,m) ((size_t)&(((s*)0)->m))

其中s为结构体类型,m为结构体成员

拆分解释:(s*)0//将0强制转化为s结构体类型的指针,这样做相当于结构体的首地址是0,同时表示结构体的首地址

((s*)0)->m) //表示结构体成员 //用指针访问成员,类似:ps->age ps为结构体指针(首地址)

((size_t)&(((s*)0)->m)) //对结构体成员取地址,并将地址值强制转化为size_t类型,由于首地址为0,所以成员的地址转化一下类型就是偏移量。

4,交换奇偶位

写一个宏,用来交换一个整数二进制的奇偶位

解析:

5,猜名次

实现思路:

使用循环创造5*5共25种情况,并判断并排除名次相同的情况,求出满足条件的情况,最后打印。

代码实现:

//猜名次 //防止重复,判断数组中是否有重复元素 int cheakdata(int* p) { //由于p[i]的范围为1~5所以创建6个空间 int tmp[6] = { 0 }; //新建一个数组,元素初始化值都为0 int i = 0; for (i = 0; i < 5; i++) //遍历p[5]中的每一个元素 { if (tmp[p[i]]) //如果不为零,说明此值已经被检测了一次,有重复元素,返回零,p[i]的范围为1~5 { return 0; } tmp[p[i]] = 1; //第一次为0,就赋值为1,之后p[i]值相同时就返回0 } return 1; //没有相同元素返回1 } int main() { int p[5] = { 0 }; //0 1 2 3 4分别表示a b c d e //五个循环嵌套,创造出5*5中情况,需要判断是否有元素相同 for (p[0] = 1; p[0] <= 5; p[0]++) { for (p[1] = 1; p[1] <= 5; p[1]++) { for (p[2] = 1; p[2] <= 5; p[2]++) { for (p[3] = 1; p[3] <= 5; p[3]++) { for (p[4] = 1; p[4] <= 5; p[4]++) { //每个人有半句话是对的 if ((p[1] == 2) + (p[0] == 3) == 1 && //b第二,a第三 (p[1] == 2) + (p[4] == 4) == 1 && //b第二,e第四 (p[2] == 1) + (p[3] == 2) == 1 && //c第一,d第二 (p[2] == 5) + (p[3] == 3) == 1 && //c第五,d第三 (p[4] == 4) + (p[0] == 1) == 1 && //e第四,a第一 cheakdata(p)) { int i = 0; for (i = 0; i < 5; i++) { printf("%d ", p[i]); } printf("\n"); } } } } } } return 0; }

执行结果:3 1 5 2 4 //a b c d e