目录
前言
字符串操作函数:
1.求取字符串长度
2.字符串拷贝,字符串连接,字符串比较(受长度限制&不受长度限制)
3.字符串查找
注意:字符串操作都是以字符串结尾标志\0结束的!!!
内存操作函数:
1.内存初始化设置函数
2.内存拷贝函数&内存移动函数
一、字符串长度函数
1.strlen():
size_t strlen(char const* _Str);
strlen()函数可以对一个字符串进行长度进行统计,而统计的结束标志是\0,但不包括\0,函数返回值是一个无符号整数表示字符串长度。
在这段代码中,因为strlen函数遇到\0所以结果是5
2.strlen()的模拟实现:
思路:字符串的储存其实是连续的字符储存,知道遇到结束标志\0。因此,要编写一个求取字符串长度的函数,我们需要传入字符串的起始地址,统计从起始位置到结束位置经理了多少字符。
函数设计:
size_t my_strlen(char* arr) {
char * p = arr;
while (*p != '\0') {
*p++;
}
return p - arr; //指针相减就是他们的相隔的元素个数
}
代码测试:
我们发现是可以实现我们想要的效果的
二、字符串拷贝函数
1.strcpy()
char * strcpy ( char * destination, const char * source );
strcpy()是将source指向原空间的字符串(包括\0)拷贝到destination指向空间里并返回destination空间的起始位置。
我们在调试过程中发现arr1拷贝到arr2的字符串hello world 但是没有变成hello world000000
所以可知在拷贝过程中也拷贝了结束标志\0
2.strcpy()的模拟实现:
思路:我们要将目的空间的字符串拷贝到另一个空间,所以我们要传入两块空间的起始地址(一个是字符串的起始地址,另一个是目的空间的起始地址)。然后返回拷入空间的地址。
函数设计:
char* my_strcpy(char* dest, char* source) {
char* ptr = dest;
while (*ptr++ = *source++) { ; }
/*相当于 *ptr=*source;
ptr++;
source++;*/
return dest;
}
while(*ptr++=*soure++):需要注意的是*和++优先级相同,则考虑他们的结核性,而结合为从右到左,所以先ptr++,*ptr
需要注意的是这里是后置++(是先使用在++)于是*ptr++变成了*ptr ,ptr+=1
代码测试:
同样arr1变成了hello world
三、字符串连接函数
1.strcat
char *strcat(char *dest, const char *src)
strcat()是将src指向空间的字符串衔接在dest空间字符串的后面
我们发现arr2的字符串衔接到了arr1的后面
2.strcat的模拟实现
思路:
因为我们要连接两个字符串,所以我们要传入两个字符串的起始空间地址,为了连接两个字符串,我们要找到字符串1的结束位置(\0)并将字符串2连接在后面,返回字符串1的起始地址
函数设计:
char* my_strcat(char* dest, char* date) {
assert(dest);
assert(date);
char* ptr = dest;
while (*ptr != '\0') {
ptr++;
}
while (*ptr++ = *date++) { ; }
return dest;
}
代码测试:
同样我们发现可以成功运行需要注意的是arr1的大小要足够连接arr2
并且arr1不能连接自己否则会变成死循环
四、字符串比较函数
1.strcmp
int strcmp(const char *s1,const char *s2);
strcmp()函数是以此比较字符串里字符的ASCLL码值大小(逐字符比较),
若s1 大于s2返回值>0
若s1 等于于s2返回值=0
若s1 小于s2返回值<0
s1中f的ASCLL码小于s2中的g,所以返回值小于0
strcmp模拟实现
思路:
因为我们要比较两个字符串的ASCLL大小所以我们需要传入两个字符串的起始地址,依次比较各个字符的大小,返回两个字符串的差值,第一个字符串比第二个大返回值大于0,等于返回值为0,小于返回值小于0.
起始字符h比n小,则直接得结果hello小于你好
函数设计
int my_strcmp(char* s1, char* s2) {
assert(s1);
assert(s2);
while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2) {
s1++;
s2++;
}
return *s1 - *s2;
}
代码测试:
测试得知首字符h的ASCLL码比n的小6所以差值为-6,得到字符串arr1小于arr2
今天先总结部分函数还有一些下篇在写
如有纰漏请不吝赐教,会及时更改