学习C语言(17)

整理今天的学习内容

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) 

  • 23
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值