文章目录
概述
属于 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.