strcat&strcpy&strncpy

strcat&strcpy&strncpy


strcat

将两个char类型链接

char d[20]="GoldenGlobal"; char *s="View"; strcat(d,s);

结果放在d中

printf("%s",d);输出 d 为 GoldenGlobalView (中间无空格)

d和s所指内存区域不可以重叠d必须有足够的空间来容纳s的字符串

返回指向d的指针。


strcat(str1,str2)会先去掉str1的结束符后再把str2接连到str1末尾

这样很符合一个字符串只能有一个结束符的规定。

char串的结束符是'\0',也就是二进制0,那么strcat的时候系统会忽略串最后的'\0'

比如strA="abcd\0",strB="ABC\0"

那么strcat(strA,strB)= "abcdABC\0"

如果strA="abcd\0\0\0……"结果也是一样的。

memset(str1,0,10); 

之后str1的下标所指地址存储的值均为0,相当于str1[10]={'0','0','0'……}

也可以理解为str1="\0\0\0……",strcat后str1的10个\0全部被忽略,字符串从起始地址接起

相当于char *str1 = “abafadfadf”;char *str2="sadfasdfa",然后str1=str2了。

ps:

memset

char型初始化函数

void *memset(void *s, int ch, size_t n);

将s所指向的某一块内存中的前n个字节的内容全部设置为ch指定的ASCII值

第一个值为指定的内存地址,块的大小由第三个参数指定

这个函数通常为新申请的内存做初始化工作, 其返回值为指向s的指针。

将s中前n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。

作用:是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法



strcpy和strncpy用法和区别


1. strcpy函数:顾名思义字符串复制函数

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

功能:把从src地址开始且含有NULL结束符的字符串赋值到以dest开始的地址空间

返回dest(地址中存储的为复制后的新值)。

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

一般函数原型实现方式:
  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; 
  } 

  该函数的参数是字符指针,也就是可以是字符串变量字符数组,因为它们的变量名代表首字符地址

字符串默认有一个null结束符,字符数组没有。

所以此处需要注意:因为src要求有null结束符,所以字符数组的长度必须大于等于src包含null结束符的总长度

例如,char* src="abcd"; char dest[5]; 这里dest的长度就至少为5。


2. strncpy函数:多个n代表可以指定字符个数进行赋值。

原型:char * strncpy(char *dest, char *src, size_tn);  

功能:将字符串src中最多n个字符复制到字符数组dest中

(它并不像strcpy一样遇到NULL才停止复制,而是等凑够n个字符才开始复制),返回指向dest的指针。

要求:如果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字符拷贝。




例如:
定义一个字符串char a[20],和一个字符串c[]="i am a teacher!";

把c复制到a中就可以这样用:

strcpy(a,c);

这个函数包含在头文件 <string.h>中.

程序代码:
#include<string.h>
#include<iostream.h>
void main()
{char a[20],c[]="i am teacher!";
strcpy(a,c);
cout<<a<<endl;
}

char * strcpy( char * dst, const char * src );

这个函数把字符串src复制到一分配好的字符串空间dst中

复制的时候包括标志字符串结尾的空字符一起复制。操作成功,返回dst,否则返回NULL.


注意,你的第二个字符串src的长度+1(+1是因为字符串以空子符结束)不能超过你为dst开辟的空间的大小

否则src里的空字符无法复制到dst里面(没有结束符了),你的dst就成了字符数组,不是字符串了

那样如果你后面有一条printf或者puts语句什么的,要打印出dst,那就会由于没有空字符标志字符串的结束而越界了




#include<iostream>
using namespace std;
void main()
{
  char a[7]="abcdef";
  char b[4]="ABC";
  strcpy(a,b);
  cout<<a[5]<<endl;
}
这个程序原本a中的数据是 "abcdef\0", b中的数据是"ABC\0"
strcpy(a,b); 把b中的字符串复制到a中, 所以a变成了"ABC\0ef\0"
所以你输出a[5], 就是f啦
----
#include<iostream>
using namespace std;
void main()
{
  char a[8]="abcdefg";
  char b[4]="jkl";
  strcpy(a+1,b+2);
  cout<<a<<endl;
}
这个程序原本a中的数据是 "abcdefg\0", b中的数据是"jkl\0"
strcpy(a+1,b+2); 把b+2中的字符串复制到a+1中
b+2是指"l\0", a+1指 "bcdefg\0"
所以复制完以后a是"al\0defg\0"
所以输出a就是al了 (遇到\0结束输出)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值