C语言函数c语言中strcpy函数数

详解C语言中strcpy()函数与strncpy()函数的使用
投稿:goldensun
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了详解C语言中strcpy()函数与strncpy()函数的使用,是C语言入门学习中的基础知识,需要的朋友可以参考下
C语言strcpy()函数:复制字符串
头文件:#include &string.h&
定义函数:
char *strcpy(char *dest, const char *src);
函数说明:strcpy()会将参数src 字符串拷贝至参数dest 所指的地址。
返回值:返回参数dest 的字符串起始地址。
附加说明:如果参数 dest 所指的内存空间不够大,可能会造成缓冲溢出(buffer Overflow)的错误情况,在编写程序时请特别留意,或者用strncpy()来取代。
#include &string.h&
char a[30] = "string(1)";
char b[] = "string(2)";
printf("before strcpy() :%s\n", a);
printf("after strcpy() :%s\n", strcpy(a, b));
执行结果:
before strcpy() :string(1)
after strcpy() :string(2)
C语言strncpy()函数:复制字符串的前n个字符
头文件:#include &string.h&
strncpy()用来复制字符串的前n个字符,其原型为:
char * strncpy(char *dest, const char *src, size_t n);
【参数说明】dest 为目标字符串指针,src 为源字符串指针。
strncpy()会将字符串src前n个字符拷贝到字符串dest。
不像strcpy(),strncpy()不会向dest追加结束标记'\0',这就引发了很多不合常理的问题,将在下面的示例中说明。
注意:src 和 dest 所指的内存区域不能重叠,且 dest 必须有足够的空间放置n个字符。
【返回值】返回字符串dest。
【函数示例】拷贝4组字符串。
#include&stdio.h&
#include&string.h&
int main(void){
char dest1[20];
char src1[] = "abc";
int n1 = 3;
char dest2[20]="********************";
char src2[] = "abcxyz";
int n2 = strlen(src2)+1;
char dest3[100] = "http://see./cpp/shell/";
char src3[6] = "abcxyz"; // 没有'\0'
int n3 = 20;
char dest4[100] = "http://see./cpp/u/yuanma/";
char src4[] = "abc\0defghigk";
int n4 = strlen(src3);
strncpy(dest1, src1, n1); // n1小于strlen(str1)+1,不会追加'\0'
strncpy(dest2, src2, n2); // n2等于strlen(str2)+1,恰好可以把src2末尾的'\0'拷贝到dest2
strncpy(dest3, src3, n3); // n3大于strlen(str3)+1,循环拷贝str3
strncpy(dest4, src4, n4); // src4中间出现'\0'
printf("dest1=%s\n", dest1);
printf("dest2=%s, dest2[15]=%c\n", dest2, dest2[10]);
printf("dest3=%s\n", dest3);
printf("dest4=%s, dest4[6]=%d, dest4[20]=%d, dest4[90]=%d\n", dest4, dest4[6], dest4[20], dest4[90]);
VC6.0运行结果:
MinGW运行结果:
从上面的运行结果可以看出,strncpy()很难掌控,行为诡异。使用strncpy()最安全方式是使n等于strlen(src)+1,即拷贝整个字符串,同时将'\0'追加到dest。但这又与strcmp()的作用没有什么两样。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具共有 2646 人关注过本帖
标题:strcpy函数编写
等 级:论坛游民
帖 子:68
专家分:10
结帖率:92.86%
&&已结贴√
&&问题点数:20&&回复次数:8&&&
strcpy函数编写
这个代码怎么运行不了啊!
#include&stdio.h&
void main()
&char *s1=&abcd&,*s2=&efg&;
&for(i=0;s2[i];i++)&&&&&/* 当s2[i]='\0'停止拷贝*/
&&s1[i]=s2[i];
&puts(s1);
[ 本帖最后由 iqyuankong 于
12:15 编辑 ]
搜索更多相关主题的帖子:
等 级:新手上路
帖 子:19
for(i=0;s2[i];i++)
什么意思?
等 级:贵宾
威 望:27
帖 子:4422
专家分:4019
#include&stdio.h&
void main()
char s1[]=&abcd&,*s2=&efg&;
for(i=0;s2[i];i++)&&&&&/* 当s2[i]='\0'停止拷贝*/
&&s1[i]=s2[i];
这样就行了
我就是真命天子,顺我者生,逆我者死!
等 级:火箭侠
帖 子:526
专家分:3036
char s1[]=&abcd&,s2[]=&efg&;
要确保目的数组的空间大于等于源数组字符个数(包括0)
等 级:蜘蛛侠
帖 子:234
专家分:1333
ANSI&&&C明确说明:修改字符串常量,效果是未定义的。编译器不同处理是不同的,一般按常量无法修改来判。
如果必须修改字符串,只需要定义字符串变量,而不是字符串常量。可以用数组的方式定义char s1[]&&&=&&&“abccd”;;这样,在程序中就可以修改字符串了。
编程=用几种语言在某个或几个平台上通过抽象思维运用一系列算法来解决现实中问题的手段
等 级:论坛游民
帖 子:68
专家分:10
回复 3楼 BlueGuy
我也试过了是数组就可以,,为什么指针不行。
等 级:火箭侠
帖 子:526
专家分:3036
&&得分:20&
char *s1=&abcd&,*s2=&efg&;
此时的&abcd&,&efg&字符串存放在只读数据段内,s1,s2指向它们的首地址,但你要更改它们的内容时,也就是要更改只读数据段内的东西了,当然是不行的了,但是我们可以读它们
等 级:蜘蛛侠
帖 子:234
专家分:1333
7楼解释的很正确,我也想把汇编代码贴出来,但他是新手,没办法
.file&&& &strcpy.c&
&&& .section&&& .rodata&&&&&&这个就是只读数据段(reas only data)
&&& .string&&& &abcd&
&&& .string&&& &efg&
.globl main
&&& .type&&& main, @function
&&& leal&&& 4(%esp), %ecx
&&& andl&&& $-16, %esp&&
编程=用几种语言在某个或几个平台上通过抽象思维运用一系列算法来解决现实中问题的手段
等 级:论坛游民
帖 子:21
专家分:54
不宜才有指针,实现strcpy应该使用数组比较好
对赋予了字符串的指针赋值是错误的,指针指向的内容是不可改变的是存储在只读区域的 ,最好自己编写一个函数
void New_strcpy( char str[] ,char dstrp[])&&// 在函数中,编译器一般实现了数组到指针的一个转变
[ 本帖最后由 psv 于
19:20 编辑 ]
版权所有,并保留所有权利。
Powered by , Processed in 0.028136 second(s), 6 queries.
Copyright&, BCCN.NET, All Rights ReservedC语言实现strcmp()和strcpy()函数
char *strcpy(char *strDest, const char *strScr)
char *address = strD
assert((strDest != NULL) && (strScr != NULL));
while(*strScr)
*strDest++ = *strScr++;
*strDest = '\0';
int strcmp (const char *str1,const char *str2)
int len = 0;
assert((str1 != NULL) && (str2 != NULL));
while(*str1 && *str2 && (*str1 == *str2))
return *str1-*str2;
void main()
char str1[]={"Hello"};
char str2[]={"World!"};
printf("%d\n",strcmp(str1,str2));
printf("%s\n",strcpy(str1,str2));
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'岩枭 的BLOG
用户名:岩枭
文章数:221
访问量:11881
注册日期:
阅读量:5863
阅读量:12276
阅读量:351406
阅读量:1049768
51CTO推荐博文
实现字符串拷贝strcpy方法一://&字符串拷贝函数的实现&&#include&stdio.h&#include&assert.h&void&my_strcpy(char&*dest,&&char&*src)//src表示source源,dest目标{assert(dest!=NULL);assert(src);char&*ret&=&dest;while&(*dest++&=&*src++){;}return&dest;}int&main(){char&arr[20];char&*p="change&world!"&;my_strcpy(arr,&p);printf("arr=%s\n",arr);return&0;}方法二:防御性的编程//&字符串拷贝函数的实现&&#include&stdio.h&#include&assert.h&#define&false&0char&my_strcpy(char&*dest,&&char&const&*src)//src表示source源,dest目标{if&(src&==&NULL){assert(false);return&0;}if&(dest&==&NULL){assert(false);return&0;}char&*ret&=&dest;while&((*dest++&=&*src++)!='\0'){;}return&}int&main(){char&arr[20];char&*p="change&world!"&;my_strcpy(arr,&p);printf("arr=%s\n",arr);return&0;}结果:arr=change&world!请按任意键继续.&.&.本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)新人求指点,程序目的是自定义一个函数,实现C语言中strcpy()函数的功能。但此程序我不知道错在哪里,希望哪位前辈可以跟我详细解释下,谢谢呢
[问题点数:20分]
新人求指点,程序目的是自定义一个函数,实现C语言中strcpy()函数的功能。但此程序我不知道错在哪里,希望哪位前辈可以跟我详细解释下,谢谢呢
[问题点数:20分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
2008年3月 Linux/Unix社区大版内专家分月排行榜第二
2012年9月 Linux/Unix社区大版内专家分月排行榜第三2007年6月 Linux/Unix社区大版内专家分月排行榜第三
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。}

我要回帖

更多关于 c语言 strcpy函数使用 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信