strlen() 函数和 sizeof() 函数通常都可以用来计算数组或者字符串的长度。在使用的时候很容易混淆。下面就通过几个简单的示例来看一看这两个函数的具体差别。

int main()
{char str[]={1,2,3};int cnt = 0;cnt = strlen(str);printf("strlen:%d\r\n",cnt);cnt = sizeof(str);printf("sizeof:%d\r\n",cnt);system("pause");return 0;
}

  定义一个数组,然后分别使用strlen() 函数和 sizeof() 函数计算数组长度然后打印出来。

  这两个函数计算出来的长度是一样的,下来将整数数组改为字符串。

int main()
{char str[]="123";int cnt = 0;cnt = strlen(str);printf("strlen:%d\r\n",cnt);cnt = sizeof(str);printf("sizeof:%d\r\n",cnt);system("pause");return 0;
}


  将数组改为字符串之后,通过 sizeof() 函数计算出来的长度比strlen() 函数计算出来的长度多1。由于字符串的末尾是以字符’\0’结束的。由此可见sizeof() 函数计算的长度应该是把结束字符也计算进去了,strlen() 函数计算的长度只是单纯计算了有效字符的长度。

  上面的数组中没有指定长度,将数组长度固定之后在测试。

int main()
{char str[10]="123";int cnt = 0;cnt = strlen(str);printf("strlen:%d\r\n",cnt);cnt = sizeof(str);printf("sizeof:%d\r\n",cnt);system("pause");return 0;
}

  将数组长度固定为10,然后测试,输出结果如下:

  通过 sizeof() 函数计算出来的长度为10,是数组真正占内存的大小。通过strlen() 函数计算出来的长度是1,是有效字符串的长度。

  由此可见 sizeof() 函数在计算长度的时候,计算的是数据类型在内存中占用的空间大小。不管当前存储的数据是否有效。而strlen() 函数计算的是有效字符占用的空间大小。

  所以通常使用strlen() 函数计算字符串的长度,使用sizeof() 计算数据类型占用空间的长度。使用比较多的就是用它来计算数组的长度。

  下面使用sizeof() 函数计算数组长度

int main()
{int val[]= {8,7,6,5,4,3,2};int cnt = 0,cnt1 = 0,cnt2 = 0;cnt1 = sizeof(val);cnt2 = sizeof(val[0]);cnt = cnt1 / cnt2;    printf("sizeof:%d,%d,%d\r\n",cnt1,cnt2,cnt);system("pause");return 0;
}

打印结果如下:

  通过打印结果可以看出cnt1为28,也就是整个数组在内存空间中所占的大小,cnt2值为4,是数组中第一个元素在内存中的空间大小。因为整形在在内存中占4个字节。所以数组的长度就是整个数组占用的空间大小除以每个字节的占用空间大小,计算出数组的长度为7。

  那么能不能也用strlen() 计算数呢?将上面代码中的sizeof 替换为 strlen。

  替换完成后编译器直接报错,提示strlen参数不能为int类型,由此可见,strlen()函数只能用于字符串中,对于其他类型的数组,要计算其长度,只能用sizeof ()函数。

C语言学习笔记---strlen()函数和sizeof()函数相关推荐

  1. golang 时间戳_go语言学习笔记(13)-defer函数、字符串常用函数和时间日期函数...

    函数-defer 在函数中,程序员经常需要创建资源(比如:数据库连接.文件句柄.锁等),为了在函数执行完毕后,及时的释放资源,go的设计者提供defer(延时机制). 细节说明: 1:当go执行到一个 ...

  2. R语言学习笔记(二)处理函数与基本图形绘制

    写在前面 主要内容 数学与统计函数 数据的标准化 概率函数 生成服从正态分布的伪随机数 字符串处理函数 应用于矩阵和数据框的函数 图形绘制 直方图的绘制(hist) 核密度图的绘制 箱线图 经验分布图 ...

  3. C语言学习笔记(字符串和字符串函数)

    九.字符串 单个字符的定义 char i = 'a'; 单个字符创建后为常量 字符串 C语言中没有字符串这种数据类型,可以通过char型数组来替代:数字0(和字符'\0'等价)结尾(0不属于字符串)的 ...

  4. R语言学习笔记(1)——cut函数

    cut()函数用法 cut():将对应的数据划分到对应区间 cut(x,y,lables,right,include.lowest) x:待划分的数据 y:判断依据(区间) right:逻辑值,默认为 ...

  5. C语言学习笔记10-指针(动态内存分配malloc/calloc、realloc、释放free,可变数组实现;Tips:返回指针的函数使用本地变量有风险!;最后:函数指针)

    C语言:指针 1. 指针:保存地址的变量 *p (pointer) ,这种变量的值是内存的地址.   取地址符& 只用于获取变量(有地址的东西)的地址:scanf函数-取地址符   地址的大小 ...

  6. c语言中void arrout,c语言学习笔记(数组、函数

    <c语言学习笔记(数组.函数>由会员分享,可在线阅读,更多相关<c语言学习笔记(数组.函数(53页珍藏版)>请在人人文库网上搜索. 1.数组2010-3-29 22:40一维数 ...

  7. c语言学习笔记【结构体02】结构体指针变量与结构体变量的函数参数,C语言学习笔记结构体02结构体指针变量与结构体变量的函数参数.docx...

    C 语言学习笔记[结构体02]结构体指针变量与结构体变量 的函数参数 C 语言学习笔记之结构体指针变量一提指针,那可 是 C 语言的核心了,有多少学子曾拜倒在指针的脚下.单纯的说指针,其实并不难,但是 ...

  8. r语言c函数怎么用,R语言学习笔记——C#中如何使用R语言setwd()函数

    在R语言编译器中,设置当前工作文件夹可以用setwd()函数. > setwd("e://桌面//") > setwd("e:\桌面\") > ...

  9. c语言注释语句执行吗,C语言学习笔记之C语言概念解析(附资料分享)每一个语句都必须以分号结尾但预处理命令函数头和花括号“}”之后不能加分号...

    [[怪兽爱C语言]C语言学习笔记之C语言概念解析(附资料分享)]https://toutiao.com/group/6582429294901854728/?iid=15906422033&a ...

最新文章

  1. visual webgui theme designer
  2. Web框架之Django_09 重要组件(Django中间件、csrf跨站请求伪造)
  3. linux C编程之makefile
  4. 低端没出路,请接触高端!
  5. python 函数部分
  6. LDAP命令介绍---verify-index--验证索引
  7. Spring Boot学习总结(23)——Spring Boot 实践经验总结
  8. ionic3 修改打包时 android sdk 路径
  9. python做后端速度慢吗_【后端开发】python如何提高运行速度
  10. matlab怎么调出来的,如何调出MATLAB内部函数的源程序?
  11. rapidxml学习记录
  12. iconv字符编码转换
  13. python 服务器和客户端 学习http请求和响应报文头
  14. XBox One 升级后显示黑屏
  15. 《詹姆斯·高斯林Java白皮书1996自译》00:概览
  16. [转载-FLUENT学习]流动仿真计算时湍流模型的选择
  17. DAO:绝无仅有但非唾手可得的实现公平协调的机会
  18. Redisson的使用与可重入锁
  19. 中小学信息学相关编程比赛清单及报名网站汇总(C++类)
  20. 通信大史记:互联网的起源故事

热门文章

  1. 信息熵(Information Entropy)
  2. 11.17 dfs poj1979 Red and Black
  3. JSONField解决序列化与反序列化字段匹配问题
  4. (转载)7个去伪存真的JavaScript面试题
  5. [Android实例] 有关spinner 的item问题 谁能给解答下??
  6. 获得系统异常的详细信息
  7. redis 了 什么地方用到_细节拉满!美团首推“百万级”Redis进阶笔记究竟有什么魅力...
  8. rea t插件 vscode_VSCode构建汇编语言环境(配置VSCode自动调用dosbox编译运行MASM/TASM程序)...
  9. mybatis plugins_[Mybatis]-[基础支持层]-插件-plugin标签解析
  10. python getattr_深入浅出Python模块