strlen sizeof strcat strcpy分裂

By admin in 4858.com on 2019年4月11日

strlen(p):

strlen sizeof strcat strcpy区别,strcatstrcpy

strlen(p):

  • 能猜度出p指向字符串的尺寸(以当前p的岗位上马),不含有终止字符’\0’;
  • p能够注解为char* p或者char p[],那三种情势strlen均能科学总括。

sizeof(p):

  • sizeof是三个操作符,非函数,其值在编写翻译期鲜明,由此当p注明为某一门类指针时,sizeof在编写翻译时并无法鲜明针对性内容的大小,故再次来到的是指针类型自个儿的轻重缓急;

当p声称为某一品类数组时,sizeof在编写翻译时即可分明针对性内容的轻重,故重返的是数组所占容积;

 

strcat(p1,p2)和strcpy(p1,p2)

相同点:

  • p一必须为内容可改变的指针,如char p一[]
  • 当p一当前本着的字符为平息字符(‘\0’)时,直接用p二内容连接或掩盖在p1当前职分及其后

不同点:

  • 当p一当前本着的字符不是终止字符(‘\0’)时,strcat会自动将p二的始末连接在悬停字符所在地点及其后;strcpy则直接用p贰内容覆盖p壹当前针对的剧情。

sizeof strcat strcpy不一样,strcatstrcpy
strlen(p):
能总结出p指向字符串的长短(以当前p的地方上马),不含有终止字符’\0’;
p能够表明为char…

strlen(p):

本文目的:

    介绍多少个常用的 c语言 字符串操作函数(头文件 string.h 包涵了选取 c语言字符串 函数
所供给的原型和申明)

  • 能推断出p指向字符串的尺寸(以当前p的职位上马),不包括终止字符’\0’;
  • p能够申明为char* p或者char p[],这两种样式strlen均能科学总结。
  • 能预计出p指向字符串的尺寸(以当前p的职位上马),不带有终止字符’\0’;
  • p能够注脚为char* p或者char p[],那三种方式strlen均能科学总括。

纲要:

  • 0.字符数组起首化
  • 1.取得字符串长度;
  • 2.复制字符串
  • 三.连接字符串
  • 四.字符串的可比
  • 5.字符串的查找

 

sizeof(p):

sizeof(p):

0.字符数组的先河化

char  szStr1[10] = {0};       ///// 全体赋值为 “0”

char  szStr2[10];    

memset(szStr2, sizeof(szStr2), 0);  ////  用 memset 函数起先化 

char  szStr3[10]4858.com,;

ZeroMemory(szStr3, sizeof(szStr3));  ///  用 ZeroMemory 函数初步化

 

字符数组的 格式化 

int  sprintf(char* _Dest, const char* _Format, …);

示例:

1 char szDst1[20] = { 0 };
2 sprintf(szDst1, "heliangAAAAAAAA"); 
3 sprintf(szDst1, "GoodNight");  /// 实践证明,它会覆盖之前的字符串,而且会在字符串("GoodNight")末尾添加 '\0'

再举1例:

1 char szDst1[20] = { 0 };
2 char szDst2[20] = "Master Oogway";
3 char szDst3[20] = { 0 };
4 sprintf(szDst1, "%s", szDst2);  /// 将一个字符数组中的字符串赋值给另一个字符数组
5 sprintf(szDst3, "hello:%d", 12345);  /// 带整数 的 格式化形式

 

  • sizeof是2个操作符,非函数,其值在编写翻译期显著,由此当p表明为某壹项目指针时,sizeof在编写翻译时并不可能分明针对性内容的大大小小,故再次来到的是指针类型本人的大大小小;
  • strlen sizeof strcat strcpy分裂。sizeof是3个操作符,非函数,其值在编译期鲜明,因此当p证明为某1项目指针时,sizeof在编写翻译时并不能够鲜明针对性内容的轻重缓急,故重回的是指针类型本人的大大小小;

一.得到字符串长度:

当p声称为某1项目数组时,sizeof在编写翻译时即可鲜明针对性内容的轻重缓急,故重临的是数组所占体积;

当p评释为某壹品类数组时,sizeof在编译时即可明确针对性内容的轻重,故再次回到的是数组所占容积;

1.一主旨介绍:

char szStr4[10] = “Oogway”;     /////       strlen(szStr4) 结果为

char szStr5[6] = {‘O’, ‘o’, ‘g’, ‘w’, ‘a’, ‘y’};   //////
  strlen(szStr伍)  结果是 不可预言的。(从
szStr5首地址起头,三个字节2个字节查找,直到找到 ‘\0’ 才返回)

 

 

1.2拓展:

    strlen()重临1个品种为 size_t
的值。这一个项目是在头文件 stddef.h
中定义的,它是八个无符号整数类型。在表明式中运用无符号数或然导致不可预期的结果。

 

if(strlen(X) >= strlen(Y)) ….   ////  平常, 语句会依据你预想的干活

if(strlen(X) – strlen(Y) >=0)….//// 不正常,那条语句会平素为真。
strlen的结果是三个无符号数,所以操作符 >=
左边的表明式也将是无符号数,而无符号数绝不容许是负的。

char  szStr0[] = “Oogway”;

if(strlen(szStr0) – 10) …. //// 不正常,表明式中并且涵盖了有标志数和无符号数。其履行结果类似于
语句 size_t iRes = strlen(szStr0) – 10;  其结果会1个无符号数。

把strlen的 重临值 强制 转为 int ,能够化解那些题材。

此间并不是推荐全都转为 int,拓展strlen只是为了证实, strlen
的重临值是size_t,是两个无符号类型,编制程序中要求记住这一点。无法犯低级错误。

strcat(p1,p2)和strcpy(p1,p2)

strcat(p1,p2)和strcpy(p1,p2)

二.复制字符串

  • #### 2.1 strcpy:

函数原型:

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

注意:

    程序员必须 保险 目的字符数组
的空间能够容纳供给复制的字符串。倘使字符串比数高管,多余的字符仍被复制,它们将覆盖原先存款和储蓄于数组前边的内部存款和储蓄器空间的值。strcpy不可能化解这些标题,因为它不可能断定目的字符数组的长短。

   
假若复制过来的字符串长度当先了dst的仓库储存空间,使用strlen总括dst字符长度的时候,将发生不可预言的结果。 
  

示例:

char  szDst[20] = {0};

char  szSrc = “hello strcpy”;

strcpy(szDst, szSrc);  ////  将szSrc里面包车型客车字符串拷贝到szDst字符数组中 

  • #### 2.2 strncpy:

函数原型:

    char* strncpy(char* dst, char const* src, size_t len);

注意:

    strncpy总是刚刚向 dst 写入 len个字符。留神!它的结果不会以 NUL 字节结尾。

    假如 strlen(src)的值小于 len,dst 数组就用额外的 NUL 字节填充到 len
长度。如若strlen(src)的值大于或等于len,那么唯有len个字符被复制到dst中。

示例:

char szDst[4] = {0};

strncpy(szDst, “Oogway”, sizeof(szDst)-1); //// 将会向
szDst拷贝3个字符。因为
strncpy不是以NUL字节结尾,所以,我们不得不拷贝 sizeof(szDst)-1
个字节。是还是不是归根结蒂驾驭,为什么好多代码里面都会有这一个 sizeof(szDst)-1 了,^_^。

相同点:

相同点:

3.连接字符串

3.1 strcat

函数原型:

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

注意:

   
strcat函数要求dst参数原先已经包涵了一个字符串(可以是空字符串)。它找到这些字符串的最终(’\0′
字符的可怜地点),并把 src字符串的一份拷贝添加获得这些职责(\0
字符会被src中的字符覆盖)。

    程序员必须保险指标字符数组剩余的长空能够保存整个源字符串。

    strcat 总会在结果字符串前面添加3个NUL 字节(正是大家说的’\0’字符)

 示例:

上面包车型地铁代码,验证了1个难题。

1.strcat真的是在’\0’的至极地点上马填充字符(’\0’字符被src中的字符覆盖).

二.strcat实在会在结果字符串(dst字符数组)前面添加二个NUL字节。那里,为了表明,我们有意识超出szDst1数组的长短。然后,通过内部存款和储蓄器拷贝,将szDst1后边的50个字节拷贝到另一个数组中观测结果。结果展现,szBuff[11]是一个’\0’字符(NUL
字节)。

1      char szDst1[8] = { 0 };
2      strcat(szDst1, "hello");
3      szDst1[6] = 'A';   //// 验证1
4      strncat(szDst1, "BBBBBB",6);
5      char szBuff[50];//// = { 0 };
6      memcpy(szBuff, szDst1, sizeof(szBuff)-1);  ////验证2

3.2 strncat

函数原型:

    char*  strncat(char* dst, char const* src, size_t len);

有了近期对 strcpy 和 strncpy
的事无巨细介绍,那里就不详细介绍strncat了。strncat相比较 strcat,就是多了一个参数,限制 了拷贝过来的字符的个数。

有几许须要注意, strncat
总是在结果字符串前边添加二个NUL字节,而且它不会像strncpy那样对目的数组用
NUL 字节举办填写。(见示例)

示例:

只是拷贝了ABC 和一个NUL 字节,并未有在后头填充 陆 个NUL字节。

     char szDst1[20] = { 0 };
     strcat(szDst1, "hello");
     szDst1[6] = 'A';////是在 '\0'字符之后填充的 无效字符,填充无效字符,主要是为了验证 strncat 是否会附加 '\0'.
     szDst1[7] = 'A';
     szDst1[8] = 'A';
     szDst1[9] = 'A';
     szDst1[10] = 'A';
     szDst1[11] = 'A';
     szDst1[12] = 'A';
     strncat(szDst1, "ABC", 10);/////我们是想给szDst1附加字符串"ABC",但是我们传入的字符长度是10。我们想看看后面剩余的6个字符,是否会用 '\0' 字符填充 

 

  • p1必须为情节可转移的指针,如char p一[]
  • 当p1当前本着的字符为截至字符(‘\0’)时,间接用p二内容连接或掩盖在p壹当前职责及其后
  • p1必须为剧情可改变的指针,如char p1[]
  • 当p一当前针对的字符为甘休字符(‘\0’)时,直接用p贰内容连接或掩盖在p一当前职责及其后

四.字符串的比较

strcmp();

int  strcmp(char const* s1, char const* s2);

要是s壹 小于 s二, strcmp 函数重回3个低于零的值。若是s壹大于 s2,函数重返2个大与零的值。假设那八个字符串相等,函数就赶回零。

 

strncmp();

int strncmp(char const* s1, char const* s2, size_t len);

strncmp最多相比len个字节。

不同点:

不同点:

5.字符串的搜寻

strchr:查找  二个字符

函数原型:

char*  strchr(char const* str, int ch);

strchr在字符串str中检索 字符 ch
第一次面世的地方,找到后函数再次来到2个对准该岗位的指针。假设不设有,再次来到二个NULL指针。

 

strstr:查找  四个子串 

函数原型:

char* strstr(char const* s1, char const* s2);

strstr在s第11中学找找整个s2第3次出现的启迪地方,并赶回3个对准该任务的指针。如果s贰未有完好的面世在s一的别样地点,函数将回来二个NULL指针。

壹旦第1个参数是贰个空字符串,函数将回来s壹。

 

  • 当p一当前本着的字符不是终止字符(‘\0’)时,strcat会自动将p二的剧情连接在终止字符所在地点及其后;strcpy则直接用p贰内容覆盖p一当前针对的内容。
  • 当p一当前本着的字符不是终止字符(‘\0’)时,strcat会自动将p2的内容连接在结束字符所在地点及其后;strcpy则直接用p2内容覆盖p1当前针对的剧情。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有