c语言—常见字符串函数与sizeof详解

article/2025/8/27 16:55:44

1.sizeof使用

a.代码1

int main()
{int a = 0;int arr[] = { 1,2,3,4 };printf("%d\n", sizeof(a));printf("%d\n", sizeof a);printf("%d\n", sizeof(&a));//表示地址的大小printf("%d\n", sizeof(int));printf("%d\n", sizeof(arr));//计算数组arr的大小(单位为字节)printf("%d\n", sizeof(arr)/sizeof(arr[0]));//计算数组arr的空间个数return 0;
}

解释:

(1)sizeof是计算大小的(单位为字节), sizeof后面可以跟变量,类型(跟类型时一定要将类型括起来),地址(因为是32位机器,所以地址大小为4字节,如果是64位,结果就是8字节),数组名。

(2)sizeof也可以计算数组的空间的个数。

2.strlen函数

a.代码1

int main()
{char arr1[] = { 'a','b','c','\0'};char arr2[] = { 'a','b','c' };char arr3[4] = { 'a','b','c' };char*str = "abc";printf("%d\n", strlen(arr1));printf("%d\n", strlen(arr2));printf("%d\n", strlen(arr3));printf("%d\n", strlen(str));return 0;
}

解释:

(1)strlen函数是计算'\0'前的元素个数,此时arr1数组有4个空间,有'\0','\0'前面有3个元素。

(2)此时arr2数组有3个空间,没有'\0',所以就产生了一个随机数。

(3)此时arr3数组有4个空间,前面3个空间放的是"abc",最后一个空间系统添加了一个'\0'。

(4)指针变量指向字符串"abc"等价与"abc\0"。

注意:

(1)strlen(包括strcmp strcpy strcat等)函数是用于字符串的,而不是整型数组的。

(2)strlen函数是计算'\0'前的字符个数,即有效字符的个数。

b.代码2

int main()
{char* str1 = "abc";char* str2 = "abcd";if (strlen("abc") < strlen("abcd")){printf("aa\n");}else{;}if (strlen(str1) - strlen(str2) > 0){printf("aa\n");}else{;}return 0;
}

解释:

(1)strlen的返回值是无符号的整型(unsigned int),所以(strlen(str1) - strlen(str2))最终的值也是无符号的,即>=0。

注意:

(1)一定要引头文件<string.h>,不然结果就只有一个"aa"

3.sizeof与strlen函数对比

a.代码1

int main()
{char arr1[] = { 'a','b','c' };//3个空间,没有字符'\0'char arr2[] = "abc";//4个空间,字符'c'后面默认跟一个'\0'char arr3[] = "a\0bc";printf("%d\n", sizeof(arr1));printf("%d\n", sizeof(arr2));printf("%d\n", sizeof(arr3));printf("%d\n", strlen(arr1));printf("%d\n", strlen(arr2));printf("%d\n", strlen(arr3));return 0;
}

解释:

(1)sizeof是计算大小的,strlen是计算'\0'前的字符个数的。 

4.strcmp函数

a.代码1

int main()
{char arr1[] = "abc";char arr2[] = "abc";char arr3[] = "bcd";printf("%d\n", strcmp(arr1, arr2));printf("%d\n", strcmp(arr1, arr3));return 0;}

解释:

(1)两个字符串比较,就是字符逐个比较,直到发现不匹配为止。

注意:

(1)两个字符串进行比较时,如果arr1等于arr2,strcmp返回零。arr1小于arr2,strcmp返回一个小于零的数(不一定是-1)。arr1大于arr2,strcmp返回一个大于零的数(不一定是1)。

(2)进行两个字符串比较时,一定要有'\0'。

b.代码2

int main()
{char arr1[] = "abc";char arr2[] = "abc";if (strcmp(arr1, arr2)){printf("aa");}else{printf("bb");}return 0;
}

 

注意:

(1)不要把代码解读成arr1与arr2相等,结果为真,执行if语句。此时的strcmp的返回值是0,所以执行else语句。

5.strncmp函数

a.代码1

​
int main()
{char* str1 = "abc";char* str2 = "abcd";printf("%d\n", strncmp(str1, str2, 2));printf("%d\n", strncmp(str1, str2, 4));return 0;
}​

解释:

(1)选择需要比较的个数,返回值和strcmp一样。

int strncmp( const char *string1, const char *string2, size_t count );

6.strcpy函数

a.代码1

int main()
{char dest[] = "abc";char* src = "de";//"de"等价于"de\0"printf("%s", strcpy(dest, src));return 0;
}

 解释:

(1)

char *strcpy( char *strDestination, const char *strSource );

将src字符串的副本(所以src是不能改变的),拷贝到到dest(所以dest是可以改变的),返回dest的地址 。

(2)"de"字符串后面是有'\0'的,当再次读取dest时,字符'c'是无效字符。

(3)拷贝后的结果

注意:

(1)数组dest是可以改变的,一定不是字符串常量,即char*dest="abc";

(2)src一定要以'\0'结尾,不然程序会崩溃的。

(3)保证dest的空间足以容纳拷贝过来的字符串,不然会导致溢出。

b.代码2

int main()
{char dest[4] = "abc";char* src = "efgh";printf("%s", strcpy(dest, src));return 0;
}

 

 解释:

(1)dest的空间只有4个,拷贝过去的字符有5个("efgh"=="efgh\0"),即使最终的结果能打印出来,但是dest周围的栈空间破坏了。

7.strncpy函数

a.代码1

int main()
{char dest[] = "abcde";char* src = "fgh";printf("%s\n", strncpy(dest, src, 5));return 0;
}

解释:

(1)

char *strncpy( char *strDest, const char *strSource, size_t count );

strncpy函数最后一个参数(count)是控制拷贝到dest里面的字符个数。当count大于src字符串个数时,数组dest将用'\0'填充到count。

b.代码2

int main()
{char dest[] = "abcde";char* src = "fgh";printf("%s\n", strncpy(dest, src, 2));return 0;
}

解释:

(1)src的字符个数大于count ,就拷贝count个字符到dest。

8.strcat函数

a.代码1

int main()
{char dest[7] = "abc";char*src = "def";printf("%s", strcat(dest, src));return 0;
}

 解释:

(1)将字符串"def"(等价于"def\0")追加到dest后面。

(2)返回值为字符数组dest的地址。

注意:

(1)保证dest剩余的空间,足以容纳下追加的字符串,否则会出现溢出的情况。

(2)字符数组dest可以改变,src指向的字符串不可以改变。

9.strncat函数

a.代码1

int main()
{char dest[7] = "abc";char*src = "def";printf("%s", strncat(dest, src,2));return 0;
}

解释:

(1)在dest后面追加2个字符,即"de" ("de"后面有一个'\0',作为结束标志)。

(2)返回值为数组dest的地址。

注意:

(1)保证dest剩余的空间,足以容纳下追加的字符,否则会出现溢出的情况。

(2)字符数组dest可以改变,src指向的字符串不可以改变。

     字符串函数与sizeof的使用今天就分享到这里了,如果对你有帮助的话,可以给个关注,随便给个赞。

  


http://chatgpt.dhexx.cn/article/haq28G4w.shtml

相关文章

sizeof函数的用法

sizeof函数的用法&#xff1a; 1、sizeof()函数是用来计算变量所占内存空间的大小&#xff0c;单位是字节&#xff08;byte&#xff09; 举例如下&#xff1a; #define _CRT_SECURE_NO_WARNINGS #include <stdio.h>//sizeof函数的用法 //sizeof()函数是用来计算变量所占…

C/C++ | sizeof()函数

C语言中 判断数据类型长度符的关键字 用法 sizeof (类型说明符) sizeof 表达式 定义 sizeof是C/C中的一个操作符&#xff08;operator&#xff09;&#xff0c;简单的说其作用就是返回一个对象或者类型所占的内存字节数。 MSDN上的解释为&#xff1a; The sizeof keyword…

开发人员必知!什么是Scrum敏捷开发?

什么是Scrum敏捷开发 Scrum是敏捷开发的一种,是一种以人为本,迭代式增量软件开发的过程,以英式橄榄球争球队形(Scrum)为名,因此可以想象,整个团队是高效而富有激情的。以人为本,即Scrum开发特别强调沟通,要求团队所有人员都坐着一起工作,通过高效的沟通解决问题。 S…

Scrum敏捷开发框架

Scrum 是一个用于开发和维持复杂产品的框架 &#xff0c;是一个增量的、迭代的开发过程。在这个框架中&#xff0c;整个开发过程由若干个短的迭代周期组成&#xff0c;一个短的迭代周期称为一个Sprint&#xff0c;每个Sprint的建议长度是2到4周(互联网产品研发可以使用1周的Spr…

Scrum敏捷开发实战分享(上篇):方法介绍、敏捷团队和敏捷流程

一、方法介绍 先从一则故事说起&#xff1a; 一天&#xff0c;一头猪和一只鸡在路上散步 鸡对猪说&#xff1a;“嘿&#xff0c;伙计&#xff0c;我们合伙开一家餐馆怎么样&#xff1f;” 猪看了一下鸡说&#xff1a;“好主意&#xff0c;那我们给它取什么名字呢&#xff…

什么是Scrum敏捷开发?

什么是敏捷开发&#xff1f; 敏捷开发(Agile Development)是一种以人为核心、迭代、循序渐进的开发方法。 怎么理解呢&#xff1f;首先&#xff0c;我们要理解它不是一门技术&#xff0c;它是一种开发方法&#xff0c;也就是一种软件开发的流程&#xff0c;它会指导我们用规定…

Scrum敏捷开发基础知识篇

Scrum 的定义 Scrum ( 名词): Scrum 是一个框架&#xff0c;在此框架中人们可以解决复杂的自适应难题&#xff0c;同 时也能高效并创造性地交付可能最高价值的产品。 Scrum 是: • 轻量的 • 易于理解的 • 难以精通的 Scrum 是一个框架&#xff0c;自上世纪 90 年代初以来&…

小团队SCRUM敏捷开发项目管理

概述 单团队敏捷开发主要是针对10人以下、只有一个Scrum团队的小型产品或项目的敏捷开发。 对于小型团队来说&#xff0c;在Leangoo中创建一个单团队敏捷开发项目就可以很好地支持团队产品或项目的开发。 适用场景 适用于单个团队进行Scrum敏捷开发协作&#xff0c;Leangoo项目…

实施Scrum敏捷开发的关键要素

一、敏捷开发由来 2001年2月11日至13日&#xff0c;美国犹他州瓦萨奇山雪鸟滑雪胜地&#xff0c;17个人聚到一起&#xff0c;试图找到软件开发的共识&#xff0c;最终的成果就是《敏捷软件开发宣言》。参会者们包括来自于极限编程、Scrum、DSDM、自适应软件开发、水晶系列、特征…

SCRUM敏捷开发教程

大家好&#xff0c;我是煎饼哥&#xff0c;本期向大家介绍一个关于敏捷开发的方法&#xff0c;叫做scrum&#xff0c;相信资深的产品经理都接触过类似的项目管理方法。 scrum敏捷开发&#xff0c;是一个美国统计学教授记录了多年工作经验&#xff0c;总结出来的一套简单易懂的开…

Scrum敏捷开发模式

前言 我的个人博客 最近报名参加了微信小程序应用开发赛&#xff0c;也是作为走向职场前的一次锻炼&#xff0c;为了模拟企业开发的流程&#xff0c;我们团队决定使用敏捷开发模式来管理项目。这篇文章&#xff0c;是对在近些天来网上学习到的Scrum敏捷开发模式的总结。 软件…

无向图的邻接表

如何根据无向图画出邻接表呢&#xff1f; 比如&#xff1a; 第一排的v1&#xff0c;与v2和v4相连&#xff0c;因此两个黄色方框内的数字分别代表v2和v4的下标&#xff1b; 第二排的v2&#xff0c;与v1、v3和v5相连&#xff0c;因此三个绿色方框内的数字分别代表v1和v3和v5的…

C++实现的邻接表

1. 在学习图的存储方式中&#xff0c;邻接矩阵和邻接表是两种比较常用的存储图的方式&#xff0c;下面使用的是C语言实现的邻接表 2. 具体的实现过程如下&#xff1a; ① 首先使用结构体声明图的结构体&#xff0c;图中顶点的结构体&#xff0c;以及指向下一条边的结构体&…

图的存储--邻接表

邻接表既适用于存储无向图&#xff0c;也适用于存储有向图。邻接表常用于稀疏图的存储。 邻接表存储图主要在于将图的各顶点建立一个链表&#xff0c;链表记录该顶点的邻接点的在数组的位置。 #define MAX_VERTEX_NUM 10 // 最大顶点数 #define INF 32767 // 不邻接 typedef…

有向图的邻接矩阵、邻接表和逆邻接表

1、如何根据有向图画出邻接矩阵&#xff1f; 如图&#xff1a; v1指向v2和v3&#xff0c;在矩阵中v1指向v2、v3的表示标1。 注意&#xff1a; v1指向v2在矩阵中是用竖列的v1对应横行的v2 2、如何根据有向图画出邻接表呢&#xff1f; 注意&#xff1a; 画有向图的邻接表时…

【数据结构】 图的邻接表

邻接表是图的另一种存储结构&#xff08;使用链表的思想&#xff09;。 该方式的基本思路&#xff1a;顶点表后指向邻接表&#xff0c;邻接表中依次为当前顶点的邻接点 准备工作 与邻接矩阵类似&#xff0c;在构造邻接表之前&#xff0c;需要存储各个顶点的信息&#xff0c;…

《数据结构》-图的邻接表表示法(四)

邻接表表示法(链式) 存储定义&#xff1a; 顶点&#xff1a;按编号顺序将顶点数据存储在一维数组中关联同一顶点的边(以顶点为尾的弧)&#xff1a;用线性链表存储 无向图的邻接表 例如&#xff0c;如下无向图 则它的邻接表为 无向图邻接表的特点&#xff1a; 邻接表不唯一…

【图】邻接表

目录 无向图的邻接表 链表&#xff08;存相邻顶点下标&#xff09;的类 数组里放的顶点 邻接表&#xff08;操作&#xff09; 构造和析构&#xff08;创建销毁邻接表&#xff09; 插入顶点 插入边 获取下标 插v1、v2之间的边 删除顶点 删除边 输出&#xff1a; 其他…

图的邻接表表示法(C语言)

邻接表 邻接表数据结构类型如下&#xff1a; #define MaxVertices 100 typedef struct node{ //边表 int adjvex;node* next; }EdgeNode; typedef struct{ //顶点表 int vertex; EdgeNode* edgenext; }VertexNode; typedef VertexNode AdjList[MaxVertices];//…

邻接表的创建

邻接表 特点&#xff1a; 1、想要知道某个顶点的度&#xff0c;就去查找这个顶点的边表中结点的个数 2、若想判断顶点 Vi 到 Vj是否存在边&#xff0c;只需测试顶点 Vi 的边表中adjvex是否存在 Vj 的下标。 3、若求顶点的所有邻接点&#xff0c;其实就是对此顶点的边表进行遍历…