1.strcpy的代码实现
函数原型 char* strcpy(char *dest, char * src, sizet_n)
将src所指向的字符串数组复制给dest数组(目前未考虑 sizet_n)
在进行复制之前,写的时候记得char[] 数组是以'\0' 结尾的,但是当时忘记string是不是以‘\0’结尾 查了一个帖子,总结:
1. const char* 字符串 以 “\0”结尾。
2. char[] 字符串 以 “\0”结尾。
3.string 字符串 不以 “\0”结尾。
4. char[n] = "string", 当string 长度+“\0”>n时,会因空间不足出错。
5.string.c_str() 转 const char* 时, 会在字符串末尾 自动补“\0”
6.char* 转string 时, 会自动把末尾的 “\0” 去掉。
7.strlen()是取字符串除去结尾符 “\0” 的长度。
归根结底:
1、char数组是以'\0'结尾但是统计长度时不考虑‘\0'。
2、string不以'\0'结尾。互相转换时符合互相的规则。
3.统计长度不带‘\0'但是定义数组的时候得带’\0'。
char * STRNCPY (char *s1, const char *s2, size_t n)
{
size_t size = __strnlen (s2, n); //获取字符串s2中实际字符个数,不包括结尾的'\0';如果实际个数 <= maxlen,则返回n,否则返回第二个参数。
if (size != n) //如果复制的长度不够n则将size到n 均补零
memset (s1 + size, '\0', n - size);
//memset
/*
void *memset(void *str, int c, size_t n)
str -- 指向要填充的内存块。
c -- 要被设置的值。该值以 int 形式传递,但是函数在填充内存块时是使用该值的无符号字符形式。
n -- 要被设置为该值的字符数。
该值返回一个指向存储区 str 的指针
*/
return memcpy (s1, s2, size); //这个复制完后不以'\0'结尾
}
若要以0结尾参考strcpy
char *
STRCPY (char *dest, const char *src)
{
return memcpy (dest, src, strlen (src) + 1);
}
看完懂的 评论区扣1。