strlen sizeof strcat strcpy区别
分类:计算机编程

strlen(p):

本文指标:

    介绍多少个常用的 c语言 字符串操作函数(头文件 string.h 满含了应用 c语言字符串 函数 所供给的原型和证明)

  • 能猜测出p指向字符串的长短(以当前p的岗位上马),不分包终止字符'\0';
  • p能够注解为char* p或者char p[],那三种样式strlen均能正确总结。

纲要:

  • 0.字符数组开端化
  • 1.获取字符串长度;
  • 2.复制字符串
  • 3.连接字符串
  • 4.字符串的可比
  • 5.字符串的追寻

 

sizeof(p):

0.字符数组的开首化

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

char  szStr2[10];    

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

char  szStr3[10];

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 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是二个操作符,非函数,其值在编写翻译期明显,由此当p注解为某一门类指针时,sizeof在编译时并不能分明针对性内容的朗朗上口,故重回的是指针类型本人的抑扬顿挫;

1.获得字符串长度:

当p证明为某一项目数组时,sizeof在编写翻译时就能够鲜明针对性内容的朗朗上口,故再次回到的是数组所占体量;

1.1着力介绍:

char szStr4[10] = "Oogway";     /////       strlen(szStr4) 结果为 6 

char szStr5[6] = {'O', 'o', 'g', 'w', 'a', 'y'};   //////   strlen(szStr5卡塔尔(قطر‎  结果是 不可预见的。(从 szStr5首地址开始,叁个字节三个字节查找,直到找到 '\0' 才返回)

 

1.2拓展:

    strlen(卡塔尔重返三个品类为 size_t 的值。那一个类型是在头文件 stddef.h 中定义的,它是多少个无符号整数类型。在表明式中应用无符号数也许引致不可预料的结果。

 

if(strlen(X卡塔尔(قطر‎ >= strlen(Y卡塔尔(英语:State of Qatar)卡塔尔(英语:State of Qatar) ....   ////  符合规律, 语句会依据你预想的干活

if(strlen(X) - strlen(Y) >=0)....//// 不正常,那条语句会一向为真。 strlen的结果是一个无符号数,所以操作符 >= 左边的表明式也将是无符号数,而无符号数绝对不可能能是负的。

char  szStr0[] = "Oogway";

if(strlen(szStr0) - 10) .... //// 不正常,表明式中同期含有了有暗号数和无符号数。其施行结果雷同于 语句 size_t iRes = strlen(szStr0卡塔尔(英语:State of Qatar) - 10;  其结果会二个无符号数。

把strlen的 重返值 强逼 转为 int ,可防止除这一个主题素材。

此间并非推荐全都转为 int,拓宽strlen只是为了表明, strlen 的再次来到值是size_t,是多少个无符号类型,编制程序中必要牢牢记住这点。不能够犯低等错误。

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

2.复制字符串

  • #### 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卡塔尔(英语:State of Qatar);  ////  将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卡塔尔(英语:State of Qatar)-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 总会在结果字符串前边加多一个NUL 字节(正是大家说的'\0'字符)

 示例:

上面包车型客车代码,验证了2个难题。

1.strcat真就是在'\0'的特别位置上马填充字符('\0'字符被src中的字符覆盖).

2.strcat实在会在结果字符串(dst字符数组)前边增加三个NUL字节。这里,为了证实,我们有意识超过szDst1数组的长短。然后,通过内部存款和储蓄器拷贝,将szDst1前边的肆拾七个字节拷贝到另一个数组中观测结果。结果显示,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 字节,并未有在后头填充 6 个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 p1[]
  • 当p1当前本着的字符为结束字符('\0'卡塔尔时,直接用p2内容连接或隐瞒在p1当前职责及其后

4.字符串的可比

strcmp();

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

假诺s1 小于 s2, strcmp 函数重返二个低于零的值。就算s1 大于 s2,函数重返三个大与零的值。假使那八个字符串相等,函数就回来零。

 

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 第1次现身的任务,找到后函数重临三个针对该职分的指针。若是一纸空文,再次回到三个NULL指针。

 

strstr:查找  一个子串 

函数原型:

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

strstr在s1中找找整个s2第1次面世的启示地方,并赶回三个针对性该岗位的指针。若是s2未有完好的出未来s1的别样地方,函数将回到贰个NULL指针。

若是第三个参数是多个空字符串,函数将重临s1。

 

  • 当p1当前针没错字符不是甘休字符('\0'卡塔尔国时,strcat会自动将p2的原委连接在甘休字符所在地方及其后;strcpy则平素用p2内容覆盖p1当前针对的剧情。

本文由pc28.am发布于计算机编程,转载请注明出处:strlen sizeof strcat strcpy区别

上一篇:C语言文件方式输入与输出 下一篇:没有了
猜你喜欢
热门排行
精彩图文
  • 应用程式开拓平台,Smobiler开采平台
    应用程式开拓平台,Smobiler开采平台
    最前面的话:Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 .Net语言 APP开发平台——Smobiler学习日志:如何在手机上实现电
  • NET开拓能源大全
    NET开拓能源大全
    目录 API 应用框架(ApplicationFrameworks) 应用模板(ApplicationTemplates) 人工智能(ArtificialIntelligence) 程序集处理(AssemblyManipulation) 资源(Assets) 认证和授
  • STM32就学笔记之C语言篇
    STM32就学笔记之C语言篇
    【unsigned】 1、rewind(FILE *卡塔尔(英语:State of Qatar):回到文件开头处 2、fprintf(), fscanf(), fgets(), fputs() (1)、fprintf(#FILE *restrict#, #const char *restrict,...#卡塔尔(英语
  • python面向对象三大特征,面向对象
    python面向对象三大特征,面向对象
    面向对象-组合 风流罗曼蒂克、面向进度与面向对象的简要介绍 一、继承 大器晚成 什么是多态动态绑定(在这里起彼伏的背景下行使时,一时也称得上多
  • HttpRuntime的认知与抓好明白,异步HTTP乞请操作
    HttpRuntime的认知与抓好明白,异步HTTP乞请操作
    一、说明 上边最早介绍HttpRuntime的Web.config里的构造 1卡塔尔(英语:State of Qatar) 那些类 是本身 在安分守己项目中,优化驱除实际难题时,不参照第三方代码