string.h
strlen()
概述
属于 string.h
头文件.
实参是一个字符串。
返回值是字符串的字符个数, 不包括空字符。因为strlen 函数从字符串开头向后依次计数,直到遇见 \0
,最终统计的字符串长度不包括 \0
。
返回值应为 size_t
类型.
函数原型:
size_t strlen(const char* str);
参数 str 表示要求长度的字符串。
返回值:字符串 str 的长度。
字符串长度是指字符串包含的字符个数 (不包括结束符 '\0'
)。
程序示例:
#include <stdio.h> #include <string.h> // 提供 strlen() 函数的原型 int main(void) { char str[10] = "hello"; long len = strlen(str); printf("The length of this string is %ld.\n", len); return 0; }
结果:
The length of this string is 5.
strlen()
遇到 \0
结束记数:
程序示例:
#include <stdio.h> #include<string.h> int main(void) { char arr1[] = "abc"; char arr2[] = { 'a','b','c' }; char arr3[] = { 'a','b','c', 0 }; char arr4[] = { 'a','b','c','\0'}; printf("%zd\n", strlen(arr1)); printf("%zd\n", strlen(arr2)); printf("%zd\n", strlen(arr3)); printf("%zd\n", strlen(arr4)); return 0; }
结果:
3 35 3 3
分析: strlen 函数向后计数, 直到遇到字符串结束符, 对于这里的 arr2, 没有明确给出一个结束符, 那么 strlen 计数时将一直向后寻找直到找到内存中某处刚好存在着的空字符, 将其当作结束符, 因此最终计数结果很奇怪.
strlen()
的返回值应为 size_t
类型, 用 printf()
输出时可用 %zd
格式控制符.
程序示例:
#include <stdio.h> #include <string.h> int main(void) { char str[10] = "hello"; size_t len = strlen(str); printf("The length of this string is %zd.\n", len); return 0; }
结果:
The length of this string is 5.
当 strlen() 遇到转义字符
程序示例:
#include <stdio.h> #include<string.h> int main(void) { printf("%zd\n", strlen("c:\today\12\today1.c")); return 0; }
结果:
16
分析: 这里 \t
, \12
, \t
均为一个字符.
strlen 函数和 sizeof 运算符的差别
作用于字符数组
sizeof 运算符作用于字符数组时, 返回字符数组占用的字节个数, 等于数组的元素个数.
strlen 函数作用于字符数组时, 从第一个元素开始向后计算字符个数, 直到遇到空字符, 返回值是空字符前面的字符个数. 此时要注意空字符在什么位置.
作用于字符串字面量
sizeof 作用于字符串字面量时,返回值为字符个数加一。
strlen 作用于字符串字面量时,返回值为字符个数。
为字符数组赋值的几种情况
指定字符数组元素个数, 赋给字符串字面量
程序示例:
#include<stdio.h> #include<string.h> int main(void) { char str1[10] = "ok"; // 是字符数组, 同时也是字符串 printf("sizeof str1 is %zd.\n", sizeof(str1)); printf("strlen of str1 is %zd.\n", strlen(str1)); return 0; }
结果:
sizeof str1 is 10. strlen of str1 is 2.
添加断点进行调试, 观察 str1 中元素的变化情况:
添加断点的示意图:
运行至断点处时, str1 中元素的值:
逐语句调试, 向下继续运行一条语句, 如图:
此时 str1 中元素的值:
可以看出, 除了前面的指定了元素的位置, 后面没有指定元素的位置, 都自动变成了空字符. 索引为 2 的元素是空字符是因为赋值了一个字符串字面量, 其最后一个元素是空字符, 索引为 2 的元素后面的其他所有元素都是空字符则是自动进行的.
指定字符数组元素个数, 赋给单个的字符, 不包括空字符
程序示例:
#include<stdio.h> #include<string.h> int main(void) { char str1[10] = {'o','k'}; printf("sizeof str1 is %zd.\n", sizeof(str1)); printf("strlen of str1 is %zd.\n", strlen(str1)); return 0; }
结果:
sizeof str1 is 10. strlen of str1 is 2.
添加断点进行调试, 观察 str1 中元素的变化情况:
添加断点的示意图:
运行至断点处时, str1 中元素的值:
逐语句调试, 向下继续运行一条语句, 如图:
此时 str1 中元素的值:
可以发现, 当指定了字符数组的元素的个数时, 不论赋给字符数组的是字符串字面量还是单个的字符 (不包含空字符), 最后字符数组中多出来的位置都会被自动赋给空字符, 字符数组都会变成字符串.
没有指定字符数组元素个数, 赋给字符串字面量
#include<stdio.h> #include<string.h> int main(void) { char str1[] = "ok"; printf("sizeof str1 is %zd.\n", sizeof(str1)); printf("strlen of str1 is %zd.\n", strlen(str1)); return 0; }
结果:
sizeof str1 is 3. strlen of str1 is 2.
打断点示意图:
此时 str1 中元素的值:
逐步运行程序, 向下运行程序一步, 得到 str1 中各个元素的值:
此处是将字符串常量 “ok” 赋值给字符数组,字符串常量 “ok” 包含了三个字符,这三个字符都被赋给了 str1.
str1 在定义时未指定元素个数,所以数组长度正好放下这三个元素,即数组长度为3.
没有指定字符数组元素个数, 赋给单个的字符, 不包含空字符
程序示例:
#include<stdio.h> #include<string.h> int main(void) { char str1[] = {'o','k'}; printf("sizeof str1 is %zd.\n", sizeof(str1)); printf("strlen of str1 is %zd.\n", strlen(str1)); return 0; }
结果:
sizeof str1 is 2. strlen of str1 is 42.
数组元素未指定, 则刚好等于元素个数, 即 2.
因为没有指定空字符, strlen 计数时一直向后找到内存中刚好存在的空字符.
打断点进行调试, 如图:
此时 str1 的内部元素的值:
逐步运行程序, 向下运行程序一步, 得到 str1 中各个元素的值:
strlen 和 sizeof 的返回类型
C99之后, strlen 和 sizeof 返回类型为 size_t, 用 printf 打印时的转换说明为 %zd.
在这之前, strlen 和 sizeof 返回类型为 unsigned 或 unsigned long, 这和具体的实现有关. 用 printf 打印时的转换说明为 %u 或 %lu.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术