上一节的练习
问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能直接将错误信息打印出来