strcpy与strncpy的区别

转载 2015年11月21日 15:44:02

首先看c++ reference中关于strcpy与strncpy的详细说明。

参看http://www.cplusplus.com/reference/cstring/strcpy/和http://www.cplusplus.com/reference/cstring/strncpy/。


其次在stackoverflow上有一个相关问题:

问题:


Edit: I've added the source for the example.

I came across this example:

char source[MAX] = "123456789";
char source1[MAX] = "123456789";
char destination[MAX] = "abcdefg";
char destination1[MAX] = "abcdefg";
char *return_string;
int index = 5;

/* This is how strcpy works */
printf("destination is originally = '%s'\n", destination);
return_string = strcpy(destination, source);
printf("after strcpy, dest becomes '%s'\n\n", destination);

/* This is how strncpy works */
printf( "destination1 is originally = '%s'\n", destination1 );
return_string = strncpy( destination1, source1, index );
printf( "After strncpy, destination1 becomes '%s'\n", destination1 );

Which produced this output:

destination is originally = 'abcdefg'
After strcpy, destination becomes '123456789'

destination1 is originally = 'abcdefg'
After strncpy, destination1 becomes '12345fg'

Which makes me wonder why anyone would want this effect. It looks like it would be confusing. This program makes me think you could basically copy over someone's name (eg. Tom Brokaw) with Tom Bro763.

What are the advantages of using strncpy() over strcpy()?



解答:

strncpy combats buffer overflow by requiring you to put a length in itstrcpy depends on a trailing \0, which may not always occur.

Secondly, why you chose to only copy 5 characters on 7 character string is beyond me, but it's producing expected behavior. It's only copying over the first n characters, where n is the third argument.

The n functions are all used as defensive coding against buffer overflows. Please use them in lieu of older functions, such as strcpy.



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

两者都是C/C++里面的字符串拷贝函数,不同的是后者多了一个参数,此参数可以指定从源拷贝多长。char* strcpy(char* strDest, const char* strSrc) char*...
  • ZH___xin
  • ZH___xin
  • 2016年07月21日 18:35
  • 488

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

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

strcpy和memcpy的区别

void *memcpy(void *dest, const void *src, int n); 从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中 #inc...
  • u014082714
  • u014082714
  • 2015年03月14日 11:59
  • 3280

别再耍流氓了: 请别再用strcpy, 而用strncpy 或stpcpy, strlcpy (linux)

strcpy,strncpy ,stpcpy
  • Fybon
  • Fybon
  • 2016年11月03日 16:18
  • 1368

内存重叠之strcpy/strncpy/strcat/strncat和memcpy---我又踩到地雷了

前面, 我们说过, strcpy是一个非常不安全的函数, 如果大家在项目中
  • stpeace
  • stpeace
  • 2014年09月21日 23:03
  • 4828

memcpy和strcpy区别以及它们的效率分析

1、首先介绍这两个函数的原型: #include char *strcpy( char *to, const char *from ); #include void *memc...
  • vgxpm
  • vgxpm
  • 2015年08月13日 17:46
  • 2703

strcpy、strncpy代码实现。

要求:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。 /***************************************************...
  • u010944778
  • u010944778
  • 2015年09月17日 17:38
  • 528

strcpy,strncpy函数实现——string.h库函数

strcpy函数实现:1.原型:#include char *strcpy(char *dest, const char *src);2.实现:实现一:char *my_strcpy1(char *d...
  • Riyadh_linux
  • Riyadh_linux
  • 2015年11月23日 22:10
  • 641

strcpy函数与strncpy的区别

1. strcpy函数:顾名思义字符串复制函数:原型:extern char *strcpy(char *dest,char *src); 功能:把从src地址开始且含有NULL结束符的字符串赋值到以...
  • a904235765
  • a904235765
  • 2015年06月23日 18:37
  • 251

strcpy和strncpy用法和区别

strcpy函数:顾名思义字符串复制函数:原型:extern char *strcpy(char *dest,char *src); 功能:把从src地址开始且含有NULL结束符的字符串赋值到以des...
  • qq_33583069
  • qq_33583069
  • 2016年07月17日 16:04
  • 180
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:strcpy与strncpy的区别
举报原因:
原因补充:

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