函数补充与常见例题分析(杂例补充)
目录
一,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