一、strcpy()函数:
函数原型:char * strcpy(char * str1,char * str2)
函数功能:将str2指向的字符串复制到str1中去
返回值:返回str1
包含文件:string.h
注意:strcpy()根据\0作为判断结束,如果参数 str1 所指的内存空间不够大,可能会造成缓冲溢出(buffer Overflow)的错误情况,使用strncpy()或许更加安全。
strcpy()源代码如下:
方法一:
int main()
{
char str2[10] = "hello";
char str1[10];
int i = 0;
for( ; str2[i] != '\0';++i)
{
str1[i] = str2[i];
}
str1[i] = '\0';
printf("%s \n",str1);
}
方法二:借助下标
void my_strcpy(char *str1,char *str2)
{
int i=0;
if(str2 == NULL ||NULL == str1) return ;
while(str2[i] != '\0')
{
str1[i] = str2[i];
i++;
}
str1[i] = '\0';
}
void main()
{
char str1[10];
char str2[10] = "hello";
my_strcpy(str1,str2);
printf("%s \n",str1);
}
运行结果:
方法三:不借助外力
void my_strcpy(char *str1,char *str2)
{
if(str2 == NULL || NULL == str1) return ;
while(*str2 != '\0')
{
*str1++ = *str2++;
}
*str1 = '\0';
}
void main()
{
char str1[10];
char str2[10] = "hello";
my_strcpy(str1,str2);
printf("%s \n",str1);
}
运行结果如上。
方法四:改进方法二
void my_strcpy(char *str1,char *str2)
{
if(str2 == NULL || NULL == str1) return ;
while(*str1++ = *str2++);
}
二、memcpy()函数
与strcpy()函数的区别:
strcpy()总是与字符串是相对应的,该函数复制的内容为字符串,然而字符串在复制的时候通常使用该函数。该函数遇到字符串的结束符\0即结束,容易导致溢出。
memcpy()可以复制任意的内容,比如:结构体、字符数组、整型等,使用的对象类型广泛,然而,除了字符串以外的其他函数在复制时通常使用该函数,然而,其复制的长度根据第三个参数来决定。
函数原型:void *memncpy(void *di,void *si,int n)
memcpy()源代码如下:
方法一:
int main()
{
char s[] = {"hello"};
char p[10];
int size = sizeof(s);
int i = 0;
for( ;i < size;++i)
{
p[i] = s[i];
}
p[i] = '\0';
printf("%s \n",p);
}
方法二:
void *my_memcpy(void *di,void *si,int size)
{
if(di == NULL||si == NULL||size < 1) return NULL;
char *s = (char *)di;
const char *p = (const char *)si;
int i = 0;
for( ;i < size;++i)
{
s[i] = p[i];
}
return di;
}
void main()
{
char buff[10] = {"hello"};
char ar[10];
my_memcpy(ar,buff,sizeof(buff));
printf("%s \n",ar);
}
方法三:
void *my_memcpy(void *di,void *si,int size)
{
if(di == NULL||si == NULL||size < 1) return NULL;
char *s = (char *)di;
const char *p = (const char *)si;
while(p[size])
{ *s++ = *p++;}
return di;
}
void main()
{
char buff[10] = {"hello"};
char ar[10];
my_memcpy(ar,buff,sizeof(buff));
printf("%s \n",ar);
}
三、strncpy()函数
函数功能:复制字符串,但是不限制复制的数量,可以选择一段字符进行复制输出。
函数原型:char *strncpy(char *di,char *si,size_t n).
这里注意:
如果*si的字符串长度<=*di的字符串长度,如果n>*si由于长度达到si NUL,正常复制,但是,如果si中有NULL,strncpy复制到NULL即使没到n也提前停止。如果n = *si串长度,与strcpy一致。注意n的选择当n > *di串长度,di栈空间溢出产生崩溃异常。
如果*si串长度>*di串长度若n =*di串长度,则*di串没有NULL字符,会导致输出会有乱码。如果不考虑*si串复制完整性,可以将*di 最后一字符置为NULL。
因此,一般情况下,使用strncpy时,建议将n置为*di串长度
strncpy()函数源代码如下:
方法一:
void main()
{
char s[] = "hello";
char p[10];
int n = 3;
int i = 0;
for( ; i < n;++i)
{
p[i] = s[i];
}
p[i] = '\0';
printf("%s \n",p);
}
方法二:使用下标
char *strncpy(char *di,char *si,int n)
{
if(si == NULL||di == NULL||n < 1) return NULL;
int i = 0;
for(;i < n;++i)
{
di[i] = si[i];
}
di[i] = '\0';
return di;
}
void main()
{
char s[] = "hello";
char d[10];
int n = 3;
strncpy(d,s,n);
printf("%s \n",d);
}
剩下的不使用下标,或者使用指针进行加减,等同前两个复制函数相似,这里不再给出详细的代码。
我是编程小白一只,初次涉猎编程,麻烦读者多多指正不足之处。