c笔记--strcpy与strncpy

一, strcpy

1,定义:

char * strcpy(char * strDest,const char * strSrc) 
  { 
  char * strDestCopy=strDest; //[3] 
  if ((strDest==NULL)||(strSrc==NULL)) //[1] 
  throw "Invalid argument(s)"; //[2] 
  while ((*strDest++=*strSrc++)!='\0'); //[4] 
  return strDestCopy; 
  } 

1.1 strcpy函数:顾名思义字符串复制函数;

1.2 原型:extern char *strcpy(char *dest,char *src);

1.3 功能:把从src地址开始且含有NULL结束符的字符串赋值到以dest开始的地址空间,返回dest(地址中存储的为复制后的新值);

1.4 要求:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。 

2 ,注意:

2.1 dest字符数组的长度必须大于等于src包含null结束符的总长度,否则dest栈空间溢出产生崩溃异常。

2.2 它是char *类型,它返回的是第一个参数dest的值,即一个字符的地址。并且第一个参数不需要指向数组首地址

3,实例:

#include<stdio.h>
#include<string.h>
#define MAX 40

int main(void)
{
    char *a="beast";
    char b[MAX]="you are the beast one.";
    char *p;
    p=strcpy(b+8,a);
    puts(a);
    puts(b);
    puts(p);
}

结果:

二,strncpy函数

1.定义

char* strncpy(char* dest, const char* src, int len)  
   
{  
   
            assert(dest!=NULL && src!=NULL);  
   
            char* temp=dest;  
   
            int i=0;  
   
            while(i++ < len  && (*temp++ = *src++)!='\0')  
   
            {}  
   
            if(*(temp)!='\0')  
   
                 *temp='\0';  
   
            return dest;  
   
}
  1. strncpy函数:多个n代表可以指定字符个数进行赋值;
  2. 原型:char * strncpy(char *dest, char *src, size_tn);
  3. 功能:将字符串src中最多n个字符复制到字符数组dest中(它并不像strcpy一样遇到NULL才停止复制,而是等凑够n个字符才开始复制),返回指向dest的指针。
  4. 要求:如果n > dest串长度,dest栈空间溢出产生崩溃异常。该函数注意的地方和strcpy类似,但是n值需特别注意: 
      1)src串长度<=dest串长度,(这里的串长度包含串尾NULL字符) 
      如果n=(0, src串长度),src的前n个字符复制到dest中。但是由于没有NULL字符,所以直接访问dest串会发生栈溢出的异常情况。这时,一般建议采取memset将dest的全部元素用null填充,如:memset(dest,0,7)(7为从dest起始地址开始前7个位置填充null,dest可以为字符指针和数组名)。注意:char* pc=”abc”; char chs[5]; sizeof(pc)为4(包含null)(有些编译器不行),sizeof(chs)为5。 
      如果n = src串长度,与strcpy一致。 
      如果n = dest串长度,[0,src串长度]处存放于desk字串,(src串长度, dest串长度]处存放NULL。 
      2)src串长度>dest串长度 
      *如果n =dest串长度,则dest串没有NULL字符,会导致输出会有乱码。如果不考虑src串复制完整性,可以将dest最后一字符置为NULL。 
      所以,一般把n设为dest(含null)的长度(除非将多个src复制到dest中)。当2)中n=dest串长度时,定义dest为字符数组,因为这时没有null字符拷贝。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值