整理今天的学习内容
1.指针运算笔试题
(1)题目1
遇到稍微复杂一点的指针题,可以画图,这样更加清晰
p的类型是int(*)[4],指向含四个元素的数组,a指a[5][5]首元素的地址,类型是int(*)[5],将a赋给p可以看作a的类型强转为int(*)[4]
由图可知&p[4][2] - &a[4][2]==-4,-4的补码为11111111 11111111 11111111 11111100,转换为16进制,则为FFFFFFFC
(2)题目2
a中存放的分别是各字符串中首字母的地址,pa存放的是a中首元素的地址
打印时从所给地址开始直到\0停止打印
(3)题目3
*cpp[-2]可以看作*(*(cpp-2)),cpp[-1][-1]可以看作*(*(cpp-1)-1)
字符函数和字符串函数
1.字符分类函数
这些函数的使用都需要包含头文件ctype.h
函数 满足下列条件返回真
iscntrl 任何控制字符
isspace 空白字符:空格' ',换页'\f',换行'\n',回车'\r’ ,制表符'\t'或者垂直制表符'\v'
isdigit 十进制数字 ‘0' ~’9' 字符
isxdigit 十六进制数字, 包括所有十进制数字字符,小写字母a~f,大写字母A~F
islower 小写字母a~z
issupper 大写字母A~Z
isalpha 字母a~z或A~Z
isalnum 字母或者数字, a~z,A~Z,0~9
ispunct 标点符号, 任何不属于数字或者字母的图形字符(可打印)
isgraph 任何图形字符
isprint 任何可打印字符, 包括图形字符和空白字符
写一个代码,将字符串中的小写字母转大写,其他字符不变
2.字符转换函数
C语言提供了两个字符转换函数:
int tolower(int c); 将参数传进去的大写字母转小写
int toupper(int c); 将参数传进去的小写字母转大写
上面的代码可以改为:
3.strlen的使用和模拟实现
(1)
size_t strlen(const char*str)
解释下面程序的运行结果:
按理说strlen(str2)==3, strlen(str1)==6, 输出结果应该为str1>str2,然而结果是str2>str1,这是因为strlen的返回值是size_t类型的,属于无符号整型,strlen(str2)-strlen(str1)==-3,-3的补码11111111 11111111 11111111 11111101储存在内存中,开头的1不被当做是符号位,那么它表示的值非常大,一定大于0,所以程序给出以上结果,可以把代码改成if(strlen(str2)>strlen(str1))或强转size_t为int
(2)strlen的模拟实现
方式一:计数器
方式二:回归
方式三:指针减指针求中间字符个数
4.strcpy的使用和模拟实现
char* strcpy(char * destination, const char * source);
源字符串必须以 '\0' 结束。
源字符串中的 '\0'会被拷贝到目标空间
目标空间必须足够大,以确保能存放源字符串
目标空间必须可修改
模拟实现strcpy:
上述代码还可以简化为:
或
5.strcat的使用和模拟实现
char* strcat(char * destination, const char * source);
源字符串必须以 '\0' 结束,‘\0'也会被追加到目标空间
目标字符串中也得有 ‘\0 ’,追加的是目标空间中的第一个\0,\0被覆盖
目标空间必须足够大,能容纳源字符串的内容
目标空间必须可修改
模拟实现strcat:
如果字符串自己给自己追加,会造成死循环(目标空间的\0被覆盖了,复制无法产生\0)