字符串和内存函数(1)

上一节的练习

 

 问1:第一步++,cpp++后指向cp的第二个元素,这一改变是永久性的,第二步解引用,通过指针找到cp的第二个元素,内容为char**类型的指针,指向c+2的地址,第三步解引用,通过指针找到c中对应的元素,内容为指向POINT的地址,从该地址开始打印,结果为POINT

问2:该表达式计算的优先级如图

第一步++,在第一问中cpp已经++过一次,再其基础上再次++,结果是cpp指向cp中的第三个元素,第二步解引用,通过指针找到cp中的第三个元素,值为char**类型的指针,指向的地址为c+1,第三步--,该指针的值 -1,指向c的第一个元素,再次解引用,得到c的第一个元素,内容为指向ENTER的指针,第四步 +3,该指针向后移动3位,得到的值为ER

问3:可以将问题简化为如图

 cpp[-2]等同于*(cpp-2),*cpp[-2]就等同于**(cpp-2)

第一步:cpp-2,cpp指向cp中的第一个元素,此改变不是永久性的;第二步:解引用得到该元素的值,为char**类型的指针,指向c+3;第三步:再次解引用,得到c+3,该地址指向FIRST;第四步:+3,该地址往后移动3位,得到ST.

问4:简化题目如图

 cpp[-1]等于*(cpp-1),cpp[-1][-1]则等于  *(*(cpp-1)-1)

 第一步:cpp-1,cpp指向向上(左)移动1个元素,指向了cp中的第二个元素;第二步:解引用,得到该元素的值,char**类型的指针,指向c+2;第三步:-1,cp的第二个元素指向的地址向左(上)移动一个元素,指向了c+1(c的第二个元素)。第四步:解引用,得到c+1,指向NEW.最后,在该地址上+1,等于向后移动一位,得到EW

1.函数介绍

 易错点:strlen函数的返回值为size_t,是无符号的,举例:

相减的结果为3-6=-3,无符号数相减的结果也为无符号数,而判断的时候是用补码进行,因此无符号数-3会先被转换为补码,再进行判断,而负数的补码是一个很大的值,因此判断结果为大于

 解决方案1:直接判断,表达式成立返回1打印大于,不成立返回0打印小于

 方案2:如果一定要作差,则将两个比较数的类型转换为int类型

如何模拟实现库函数strlen

法1:

 法2(指针-指针):

法3(递归):

 注意:拷贝的时候源字符串中必须包含'\0',否则会一直拷贝,导致出错。

模拟实现

改进

 

 这就是链式访问,前提是函数有返回值

字符串的副本追加到目标字符串。目标中的终止空字符被的第一个字符覆盖,并且在目标中由两者串联形成的新字符串的末尾包含一个空字符。
 源头和目标都必须包含'\0'

模拟实现

 使用stract函数不能给自己追加

用来比较两个字符串的大小,逐字符比较

模拟实现

 带n的这些长度受限的函数,是有一个单独参数来传递长度

 strncpy是在strcpy的基础上加了拷贝字符数量的限制,而不是像strcpy一样无限制的拷贝直到‘\0'

 strncat是在追加的时候,只追加数量为n个字符,并再末尾加上'\0'

 strncmp只比较前n个字符的大小

 

 字符串中找子字符串,找字符串str2在str1中第一次出现的位置,并返回这个地址,找不到就返回空指针

如果希望找不到返回空指针的时候打印找不到,可以这样做

模拟实现

char* my_strstr( char* str1,  char* str2)
{
	assert(str1);
	assert(str2);
	//cp在字符串1中遍历查找跟字符串2首字符相同的字符
	//当发现相同,需要s1从cp的位置和s2从字符串2开头位置开始遍历查找是否相同
    char* cp = str1;
    char* s1 = cp;
	char* s2 = str2;
	while (*cp)//当cp在字符串1中遍历到'\0'时,循环结束
	{
		//每次cp继续向前遍历之前都要重置s1和s2
		s1 = cp;
		s2 = str2;
		//当字符串1的剩余长度不足以和字符串2匹配,s1比s2先走到了'\0',那么查找就失败了,不应该进入此循环
		while(*s1 && *s1 == *s2)
		{
			s1++;
			s2++;
			//当s2遍历到末尾了,说明成功在字符串1中找到了字符串2,返回字符串2的起始位置(cp)
			if (*s2 == '\0')
				return cp;
		}
		cp++;
	}
	//字符串1遍历完全都没有查找成功,那么就查找失败了,返回空指针
	return NULL;
}
int main()
{
	char* ret = my_strstr("abcdefg", "e");
	if(ret!=NULL)
		printf("%s\n", ret);
	else
		printf("找不到\n");

	return 0;
}

 使用方法:

 stryok中的第一个参数不为NULL时,会找到 str 中的下一个标记符号,将其改成 '\0',并保存这个位置,返回指向其之前字段的指针

为 NULL 时,能够直接从上次被保存的地址开始查找下一个标记符号

字符串中不存在更多标记时,返回空指针

但如果不知道字符串中有多少标记

错误代码1-10代表的错误信息

使用方法:

 

 perror能直接将错误信息打印出来

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值