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

发布时间:2026/7/24 22:28:58
函数补充与常见例题分析(杂例补充) 目录一atoi函数二isspace函数三isdigit函数四例题1序列中删除指定数字2数组串联3offsetof宏的实现4交换奇偶位一atoi函数头文件#include stdlib.h核心功能将字符串转化为整形(int)语法int atoi(const char* str)str为以\0结尾的要转化的字符串如果无法有效转化就会返回0转化特点1如果遇到空格就跳过2可以识别正负号正号不显示负号显示3当遇到字母字符时会直接停止当字符串中的所有数字都在字母字符后时会直接返回04遇到超出int范围的值时大于返回int的最大值小于返回int的最小值注意当字符串中有浮点数时atoi只会转化整数部分小数部分会直接忽略。运用展示当字符串为 a1234 时打印0当为 -12a34时打印-12当为 -12.34时打印-121.模拟实现atoi函数二isspace函数头文件#include ctype.h核心功能检查字符是否空白字符语法int isspace(int c)当是空白字符时返回一个非零数当不是空白字符时返回0C语言中的空白字符有以下几种三isdigit函数核心功能判断字符是不是‘0’~‘9’的数字字符头文件#include ctype.h语法int isdigit(int c)c为要传入的字符的ASCII码值范围0c255或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(i0;in;i) { scanf(%d ,arr[i]); } //删除值 int del 0; scanf(%d,del); //重排序-两个变量记录下标 int a 0; int b 0; for(a0;an;a) { if(arr[a]!del) { arr[b] arr[a]; b; } } int k 0; for(k0;kb;k) { printf(%d ,arr[k]); } return 0; }分析关键内容在于最后的重新排序上述最后的循环次序是不可更改的在a到达要删除的数字前b先到达再通过判断让a停下在b变大前将a处的值传给b实现序列的更改。2数组串联3offsetof宏的实现头文件#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