索引
说明主要用于自我复习 不足之处还请见谅
常见字符串函数
1,strlen
size_t strlen ( const char * str );
字符串已经 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。
参数指向的字符串必须要以 ‘\0’ 结束。
注意函数的返回值为size_t,是无符号的( 易错 )
2, strcpy
char* strcpy(char * destination, const char * source );
源字符串必须以 ‘\0’ 结束。
会将源字符串中的 ‘\0’ 拷贝到目标空间。
目标空间必须足够大,以确保能存放源字符串。
目标空间必须可变
3,strcat
将原来的字符串添加到目标字符串后面并且新的字符串以\0结尾
源字符串必须有’\0’;
4,strcmp
比较字符串主要就是根据字典序进行排序
5,strstr
char * strstr ( const char *str1, const char * str2);
返回str2在str1中出现的第一个地址,如果str1中不存在str2那么便返回NULL
memcpy与memmove
void * memcpy ( void * destination, const void * source, size_t num );
函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。这个函数在遇到 ‘\0’ 的时候并不会停下来。
如果source和destination有任何的重叠,复制的结果都是未定义的
void * memmove ( void * destination, const void * source, size_t num );
和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。如果源空间和目标空间出现重叠,就得使用memmove函数处理
例如假设有一个数组a,如果是memcpy(a,a+3)的话那么这个操作是未被定义的,具体的复制方式以及复制能否成功主要还是看编译器是否支持。但是如果使用memmove确实可以直接使用的
memcpy模拟实现
由于不知道复制的类型,所以我们模拟的时候都是先将指针强制转换成char*然后再解引用
void* my_memcpy(const void* e1, const void* e2,size_t num)
{
assert(e1 && e2);
void* ret = e1;
while (num--)
{
*(char*)e1 = *(char*)e2;
e1 = (char*)e1+1;
e2 = (char*)e2+1;
}
return ret;
}
memmove函数的模拟实现
void* my_memmove(const void* e1, const void* e2,size_t num)
{
assert(e1 && e2);
void* ret = e1;//待会要返回的就是ret;
if (e1 > e2)//如果e1>e2那么就是从e2从后开始往前拷贝
//因为这样才不会覆盖
//否则从前开始拷贝
{
e1 = (char*)e1 + num - 1;
e2 = (char*)e2 + num - 1;
while
掌握字符串函数与结构体对齐:内存管理、位段与跨平台挑战

最低0.47元/天 解锁文章
3454





