一、strcpy()与strncpy()
strcpy():strcpy(dest,src); strcpy把src所指向以'\0'结尾的字符串复制到dest所指的数组中,返回指向dest的指针。
当sizeof(dest)>=sizeof(src)时,拷贝正确,并在dest字符串后面加入'\0';
当sizeof(dest)<sizeof(src)时,拷贝出错。
strncpy():strncpy(dest,src,n); strncpy把src所指向以'\0'结尾的字符串的前n个字符复制到dest所指的数组中,返回指向dest的指针。
当n>=sizeof(src)时,拷贝正确,并在dest字符串后面加入'\0';
当n<sizeof(src)时,只拷贝src前n-1个字符串到dest,不会为dest字符串后面加入'\0';
示例代码:
#include<iostream>
#include<string>
using namespace std;
int main()
{
char a[]="lanzhihui is a good boy!";
//以下strcpy
char b[30];
char c[30];
char d[30];
strcpy(b,a); //strcpy进行简单的拷贝,除了拷贝a数组的字符串外,还会将a数组后面的'\0'拷贝给数组b.
cout<<"b:"<<b<<endl;//当数组b的存储空间 sizeof(b)>=sizeof(a) 时,正确拷贝,并在数组b字符串后加'\0'。
//当数组b的存储空间 sizeof(b)<sizeof(a) 时,拷贝出错。
cout<<"strlen(c):"<<strlen(strcpy(d,strcpy(c,a)))<<endl;//先是将a拷贝给c,strcpy返回c的地址,将c拷贝给d,并返回d的地址,再求字符串d的字符长度。
//这是拷贝strcpy()函数拷贝完后,返回目标字符串地址的原因,可以支持链式表达等。
cout<<"c:"<<c<<endl;
cout<<"d:"<<d<<endl;
//以下strncpy
char e[10];
char f[30];
char g[30];
strncpy(f,a,sizeof(f)); //sizeof(f)>=sizeof(a) 时,正确拷贝,
strncpy(g,a,10); //拷贝a中前9个字符到g中,必须手动为g数组加入'\0'
g[9]='\0'; //n<sizeof(a)时,必须有这一句,不然输出出错
strncpy(e,a,sizeof(e));
e[sizeof(e)-1]='\0'; //sizeof(e)<sizeof(a)时,必须有这一句,不然输出出错
cout<<"e:"<<e<<endl;
cout<<"f:"<<f<<endl;
cout<<"g:"<<g<<endl;
system("pause");
return 0;
}
举例理解strcpy()与strncpy()函数拷贝以 '\0' 结束:
#include<iostream>
#include<string>
using namespace std;
int main()
{
char s[]="lanzhihui\0 is a good boy!";
char name[30];
strcpy(name,s);//拷贝以'\0'结束
cout<<name<<endl;//输出以'\0'结束
strncpy(name,s,sizeof(name));//拷贝以'\0'结束
cout<<name<<endl;//输出以'\0'结束
system("pause");
return 0;
}
二、strcpy()与strncpy()实现
根据对strcpy()与strncpy()函数功能的测试,写出实现的代码:
#include<iostream>
#include<string>
#include<assert.h>
using namespace std;
char *strcpy_m(char *dest,const char *str)
{
assert((dest!=NULL)&&(str!=NULL));
char *cp=dest;
while((*cp++=*str++)!='\0')
{
//
}
return dest;
}
char *strncpy_m(char *dest,const char *str,int n)
{
assert((dest!=NULL)&&(str!=NULL));
char *cp=dest;
while(n&&(*cp++=*str++)!='\0')
{
n--;
}
if(n)
{
while(--n)
*cp++='\0';
}
return dest;
}
int main()
{
char a[]="lanzhihui is a good boy!";
//以下strcpy_m
char b[30];
char c[30];
char d[30];
strcpy_m(b,a);
cout<<"b:"<<b<<endl;
cout<<"strlen(c):"<<strlen(strcpy_m(d,strcpy_m(c,a)))<<endl;
cout<<"c:"<<c<<endl;
cout<<"d:"<<d<<endl;
//以下strncpy_m
char e[10];
char f[30];
char g[30];
strncpy_m(f,a,sizeof(f));
strncpy_m(g,a,10);
g[9]='\0';
strncpy_m(e,a,sizeof(e));
e[sizeof(e)-1]='\0';
cout<<"e:"<<e<<endl;
cout<<"f:"<<f<<endl;
cout<<"g:"<<g<<endl;
system("pause");
return 0;
}
可见自己写的strcpy_m()函数与strncpy_m()函数与库函数运行结果一样。