1. sizeof
用法
sizeof
是一个编译时运算符,主要用于获取变量或类型的内存大小(单位是字节)。对于数组,sizeof
会返回整个数组的大小,包括所有元素和终止符 '\0'
。然而,对于指针类型的字符串,它返回的是指针本身的大小,而不是指向的字符数组的大小。
对数组的行为:
对于一个字符数组,如:
char str[] = "Hello";
sizeof(str)
返回的是整个数组的大小,包括 '\0'
终止符。例如,str
中存储的是 "Hello"
,但它实际上包含 6 个字符(H
, e
, l
, l
, o
, \0
),因此 sizeof(str)
返回 6。
int main() {
char str[] = "Hello";
printf("sizeof(str): %zu\n", sizeof(str)); // 输出:6
return 0;
}
对指针的行为:
对于字符串字面量(例如 "Hello"
),如果你使用指针来引用它,sizeof
返回的是指针本身的大小,而不是字符串的长度。
int main() {
char *str = "Hello";
printf("sizeof(str): %zu\n", sizeof(str)); // 输出:4 或 8(取决于平台)
return 0;
}
在这个例子中,sizeof(str)
返回的是指针的大小,而不是指向的字符串的长度。
2.strlen
用法
在 C 语言中,计算字符串长度通常使用标准库函数 strlen,该函数定义在头文件 <string.h>
中。它的原型如下:
size_t strlen(const char *str);
strlen 函数从字符串的起始地址开始,逐个字符地查找,直到遇到字符串结束标志 '\0'
(空字符),并返回该字符串中字符的数量(不包括 '\0'
)。
示例代码
下面是一个使用 strlen
的简单示例:
#include <stdio.h>
#include <string.h>
int main(void) {
char str[] = "Hello, World!";
size_t len = strlen(str);
printf("字符串长度为:%zu\n", len);
return 0;
}
3.自定义实现字符串长度函数
如果你想了解 strlen
的内部工作原理,可以自己实现一个类似的函数,如下所示:
#include <stdio.h>
size_t my_strlen(const char *str) {
size_t count = 0;
while (str[count] != '\0') {
count++;
}
return count;
}
int main(void) {
char str[] = "Hello, World!";
size_t len = my_strlen(str);
printf("字符串长度为:%zu\n", len);
return 0;
}
在这个自定义函数中,我们通过一个计数器 count
来遍历字符串,直到遇到空字符 '\0'
,并返回计数器的值作为字符串的长度。
这两种方法都可以有效地计算字符串的长度,根据具体情况选择使用标准库函数或自定义函数。
4.为什么不用 sizeof
来计算字符串长度?
- 数组与指针的差异: 如果你的字符串是通过指针(例如
char *str = "Hello";
)表示的,sizeof
不会返回字符串的实际长度,而是指针的大小。因此,sizeof
不适用于动态字符串(如通过malloc
或字符串常量)来计算长度。
Hello";)表示的,
sizeof不会返回字符串的实际长度,而是指针的大小。因此,
sizeof不适用于动态字符串(如通过
malloc` 或字符串常量)来计算长度。 - 终止符: 对于字符数组,
sizeof
返回的是包括终止符'\0'
在内的整个数组大小,但strlen
返回的是不包括终止符的字符数量。如果你需要计算字符串的字符长度(不包括'\0'
),strlen
更合适。