目录
strcpy
声明:
char* strcpy( char* destination, const char* source )
参数
- destination -- 指向存储复制内容的目标数组
- source -- 要复制的对象
返回值:函数返回一个指向目标字符串destination 的指针
- 源字符串必须以 '\0' 结束。
- 会将源字符串中的 '\0' 拷贝到目标空间。
- 目标空间必须足够大,以确保能存放源字符串。
- 目标空间必须可变
#include<stdio.h>
#include<string.h>
int main()
{
char a[] = "hello";
char b[] = "world";
printf("%s", strcpy(a, b)); world
return 0;
}
模拟实现:
#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest, const char* src)
{
assert(dest && src);
char* ret = dest;
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char a[] = "hello";
char b[] = "world";
printf("%s", my_strcpy(a, b));
return 0;
}
strcat
声明
char* strcat( char* destination, const char* source )
参数
- destination -- 指向存储复制内容的目标数组
- source -- 要复制的对象
返回值:函数返回一个指向目标字符串destination 的指针
说明:
- 源字符串必须以 '\0' 结束。
- 目标空间必须有足够的大,能容纳下源字符串的内容。
- 目标空间必须可修改
#include<stdio.h>
#include<string.h>
int main()
{
char a[20] = "hello";
char b[20] = "world";
printf("%s", strcat(a, b)); helloworld
return 0;
}
模拟实现
#include<stdio.h>
#include<assert.h>
#include<string.h>
char* my_strcat(char* dest, const char* src)
{
assert(dest && src);
char* ret = dest;
int len = strlen(dest);
dest += len;
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char a[20] = "hello";
char b[20] = "world";
printf("%s", my_strcat(a, b));
return 0;
}
strncpy
声明
char* strncpy( char* destination,const char* source,size_t num )
参数
- destination -- 指向存储复制内容的目标数组
- source -- 要复制的对象
返回值:函数返回一个指向目标字符串destination 的指针
函数说明 :
- 拷贝num个字符从源字符串到目标空间。
- 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加' \0 ',直到num个
#include<stdio.h>
#include<string.h>
int main()
{
char a[20] = "hello";
char b[20] = "world";
printf("%s", strncpy(a, b, 1)); wello
return 0;
}
模拟实现、
#include<stdio.h>
#include<assert.h>
char* my_strncpy(char* dest, const char* src, size_t n)
{
assert(dest && src);
char* ret = dest;
while (n--)
{
*dest++ = *src++;
}
return ret;
}
int main()
{
char a[] = "hello";
char b[] = "world";
printf("%s", my_strncpy(a, b, 1));
return 0;
}
strncat
声明
char* strncat( char* destination,const char* source,size_t num )
参数
- destination -- 指向存储复制内容的目标数组
- source -- 要复制的对象
返回值:函数返回一个指向目标字符串destination 的指针
说明:
- 源字符串必须以 '\0' 结束。
- 目标空间必须有足够的大,能容纳下源字符串的内容
- 字符完成追加后,自动追加 ‘ \0 ’
#include<stdio.h>
#include<string.h>
int main()
{
char a[20] = "hello";
char b[20] = "world";
printf("%s", strncat(a, b, 5)); helloworld
return 0;
}
模拟实现:
#include<stdio.h>
#include<assert.h>
char* my_strncpy(char* dest, const char* src, size_t n)
{
assert(dest && src);
char* ret = dest;
int len = strlen(dest);
dest = dest + len;
while (n--)
{
*dest++ = *src++;
}
return ret;
}
int main()
{
char a[] = "hello";
char b[] = "world";
printf("%s", my_strncat(a, b, 5));
return 0;
}
strstr
声明
char * strstr ( const char *str1, const char * str2)
参数
- str1 -- 被查找的对象
- str2 -- 查找的目标
返回值:函数返回一个指向目标字符串str1中子串的指针,若未找到需要查找的目标则返回NULL
#include<stdio.h>
#include<string.h>
int main()
{
char a[] = "abcdefg";
char b[] = "bcd";
printf("%s", strstr(a, b));
return 0;
}
模拟实现:
#include<stdio.h>
#include<assert.h>
char* my_strstr(const char* str1, const char* str2)
{
assert(str1 && str2);
const char* s1 = str1;
const char* s2 = str2;
const char* p = str1;
while (*s1)
{
s2 = str2;
s1 = p;
while (*s1 != '\0' && *s2 != '\0' && *s1++ == *s2++);
if (*s2)
{
return p;
}
p++;
}
return NULL;
}
int main()
{
char a[] = "abbbcde";
char b[] = "bbc";
char* ret = my_strstr(a, b);
if (ret == NULL)
{
printf("子串不存在");
}
else
{
printf("%s", ret);
}
return 0;
}
memcpy
声明
void* memcpy( void* dest, const void* src, size_t num )
参数
- dest -- 目标内存
- src -- 拷贝的对象
- num -- 拷贝的字节数
说明:
- 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
- 这个函数在遇到 '\0' 的时候并不会停下来。
- 如果source和destination有任何的重叠,复制的结果都是未定义的
#include<stdio.h>
#include<string.h>
int main()
{
char a[] = "abcdefg";
char b[] = "bcd";
printf("%s", memcpy(a, b, 3)); bcddefg
return 0;
}
模拟实现:
#include<stdio.h>
#include<assert.h>
void* my_memcpy(void* str1, const void* str2, size_t n)
{
assert(str1 && str2);
while (n--)
{
*(char*)str1 = *(char*)str2;
str1 = (char*)str1 + 1;
str2 = (char*)str2 + 1;
}
}
int main()
{
char a[] = "hello";
char b[] = "bit";
my_memcpy(a, b, 3);
printf("%s", a);
return 0;
}
由于str1,str2属于void*类型,所以不能直接进行++,只能强转后加1
memmove
声明
void* memmove( void* dest, const void* src, size_t num )
参数
- dest -- 目标内存
- src -- 拷贝的对象
- num -- 拷贝的字节数
说明
- 和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
- 如果源空间和目标空间出现重叠,就得使用memmove函数处理
#include<stdio.h>
#include<string.h>
int main()
{
char a[] = "abcdefg";
printf("%s", memmove(a, a+2, 3)); cdedefg
return 0;
}
模拟实现:
#include<stdio.h>
#include<assert.h>
void* my_memmove(void* dest, const void* src, size_t n)
{
assert(dest && src);
if (dest < src)
{
while (n--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
while (n--)
{
*((char*)dest + n) = *((char*)src + n);
}
}
}
int main()
{
int a[] = { 1,2,3,4,5,6,7,8 };
my_memmove(a, a+2, 16);
for (int i = 0; i < 8; i++)
{
printf("%d ", a[i]);
}
return 0;
}