字符串函数---strcpy()与strncpy()详解及实现

原创 2014年10月06日 13:20:37

一、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()函数与库函数运行结果一样。

相关文章推荐

strncpy函数的用法

文章来源:http://blog.sina.com.cn/s/blog_4c4efaf6010008xu.html 利用标准库函数strncpy(),可以将一字符串的一部分拷贝到另一个字符串中。st...

看到的一篇介绍strncpy()函数比较…

原文:http://blog.csdn.net/ephuizi/article/details/7099050 strncpy()函数 原型:extern char *strncpy(char *de...
  • fouweng
  • fouweng
  • 2016年12月02日 15:51
  • 349

别再耍流氓了: 请别再用strcpy, 而用strncpy

我们先来看看strcpy, 下面的程序没有问题: #include using namespace std; int main() { char str[4] = {0}; char *p ...
  • stpeace
  • stpeace
  • 2014年03月30日 14:31
  • 10935

C/C++笔记--strcpy和strncpy函数的安全性分析

两者都是C/C++里面的字符串拷贝函数,不同的是后者多了一个参数,此参数可以指定从源拷贝多长。char* strcpy(char* strDest, const char* strSrc) char*...

看到的一篇介绍strncpy()函数比较好的文章

strncpy()函数 原型:extern char *strncpy(char *dest, char *src, int n);    用法:#include     功能:把src所指...
  • EPhuizi
  • EPhuizi
  • 2011年12月24日 02:18
  • 40615

mysql binlog日志自动清理及手动删除

说明: 当开启mysql数据库主从时,会产生大量如mysql-bin.00000* log的文件,这会大量耗费您的硬盘空间。 mysql-bin.000001 mysql-bin.000002 ...
  • atco
  • atco
  • 2014年04月21日 16:08
  • 35927

linux 根目录存储空间不够

首先你要关掉系统,把分配的硬盘空间变大,或者重新建立一个虚拟硬盘(这时下面的就不是sda了,而是sdb1了)。这两种方法都可行,我都试过了。 其次用root用户登录到你的linux系统,查看你系统的...
  • jsyao
  • jsyao
  • 2012年07月26日 16:08
  • 12737

linux tar压缩排除某个文件夹

一般直接用tar命令打包很简单,直接使用 tar -zcvf test.tar.gz test 即可。 在很多时候,我们要对某一个目录打包,而这个目录下有几十个子目录和子文件,我们需要在打包的时候排除...
  • catoop
  • catoop
  • 2014年10月31日 11:40
  • 36593

c++中的strncpy

#include #include #include using namespace std; int main() { char sentence1[]="Hello world Hi wo...

strcpy,strncpy和strncpy_s的区别 strncpy函数与memcpy函数

首先说下strcpy strcpy()是依据源串的\0作为结束判断的,不检查copy先的Buffer的Size,如果目标空间不够,就有BufferOverflow问题。 strncpy的原型为: ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:字符串函数---strcpy()与strncpy()详解及实现
举报原因:
原因补充:

(最多只允许输入30个字)