目录
strlen函数
strlen函数是C语言中的一个字符串函数,用于计算一个字符串的长度。 它的原型如下:
size_t strlen(const char *str);
其中,参数str是一个指向以\0字符结尾的字符串的指针,函数返回值是一个无符号整型(size_t),表示字符串的长度。
函数的功能是遍历字符串,直到遇到\0字符,然后返回所遍历的字符(包括空格)数(不包括\0字符)。
示例代码:
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello World";
int len = strlen(str);
printf("Length of string: %d\n", len);
return 0;
}
输出结果:
Length of string: 11
上述代码中,我们首先声明一个字符数组str
并使用字符串常量进行初始化。然后,使用strlen
函数计算字符串的长度,并将结果打印输出。
注意点
传入的参数必须是指向以\0字符结尾的字符串
我们先来看个例子
#include <stdio.h>
#include <string.h>
int main()
{
char arr[10] = "abcde";
int num = strlen(arr);
printf("数组arr的长度为:%d\n", num);
return 0;
}
结果是
数组arr的长度为:5
我们再看看
#include <stdio.h>
#include <string.h>
int main()
{
char arr[] = { 'a','b','c','d','e' };
int num = strlen(arr);
printf("数组arr的长度:%d\n", num);
return 0;
}
结果是
数组arr的长度:74
我们惊奇的发现,这两次的结果怎么不一样呢?原来是strlen()只以\0为结尾标志,所以传入的参数必须是指向以\0字符结尾的字符串,否则会返回随机值
strlen()的返回值是无符号整型
此外
strlen("abc")-strlen("abcdef")
这是不可取的,因为strlen()的返回值是无符号整型,是正整数,上面这就相当于3-5,会出现负数,这是不允许的
模拟实现
1.计数器的方式
#include<stdio.h>
#include<assert.h>
size_t my_strlen1(const char* a)
{
assert(a);
size_t count=0;
while (*a != '\0')
{
count++;
a++;
}
return count;
}
int main()
{
char arr1[] = "abcdefg";
size_t num1 = my_strlen1(arr1);
printf("字符串arr1的长度为:%zd\n", num1);
}
2.递归的方式
#include<stdio.h>
#include<assert.h>
size_t my_strlen2(const char* a)
{
assert(a);
if (*a == '\0')
{
return 0;
}
else
{
return 1 + my_strlen2(++a);
}
}
int main()
{
char arr1[] = "abcdefg";
size_t num1 = my_strlen2(arr1);
printf("字符串arr1的长度为:%zd\n", num1);
}
3.指针相减
#include<stdio.h>
#include<assert.h>
size_t my_strlen3(const char* a)
{
assert(a);
char* start = a;
while (*a != '\0')
{
a++;
}
return a - start;
}
int main()
{
char arr1[] = "abcdefg";
size_t num1 = my_strlen3(arr1);
printf("字符串arr1的长度为:%zd\n", num1);
}
strlen函数和sizeof的区别
sizeof
和 strlen
在 C 语言中都是用于测量数据大小的函数,但它们在操作的对象、测量的方式以及返回的结果等方面有显著的不同。
-
操作对象:
sizeof
是一个运算符,它返回的是其操作数在内存中的大小(以字节为单位)。这个操作数可以是一个类型、一个对象或者一个表达式。例如,sizeof(int)
、sizeof(array)
或sizeof(struct MyStruct)
都是有效的。strlen
是一个函数,它返回的是字符串的长度(不包括结尾的空字符 '\0')。这个函数只接受一个参数,即一个指向以空字符 '\0' 结尾的字符数组的指针(通常我们称之为 C 字符串)。
-
测量方式:
sizeof
在编译时计算其操作数的大小。它直接获取类型或对象在内存中的大小,而不需要访问实际的内存内容。strlen
在运行时计算字符串的长度。它通过遍历字符串,直到遇到空字符 '\0' 为止,来计算字符串的长度。
-
返回值:
sizeof
返回的是一个无符号整数类型size_t
,表示的是字节数。strlen
返回的也是一个无符号整数类型size_t
,表示的是字符数(不包括结尾的空字符)。
-
处理空指针:
- 当你对一个空指针使用
sizeof
时,它返回的是指针类型的大小,而不是零。例如,在 32 位系统上,sizeof(NULL)
通常返回 4(因为指针的大小是 4 字节)。 - 当你对一个空指针使用
strlen
时,结果是未定义的(通常会导致程序崩溃,因为strlen
会尝试读取指针指向的内存)。
- 当你对一个空指针使用
-
处理数组:
- 当
sizeof
作用于一个数组时,它返回的是整个数组的大小(字节数)。 strlen
只能用于处理以空字符 '\0' 结尾的字符数组(即 C 字符串)。如果直接对一个非字符串的字符数组使用strlen
,结果将是未定义的,因为strlen
会继续读取内存直到遇到空字符为止。
- 当
总的来说,sizeof
和 strlen
在功能和使用上有显著的区别。你需要根据你的具体需求来选择合适的函数。
下面是一个使用 C 语言来展示 sizeof 和 strlen 区别的例子:
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello, World!";
char *ptr = str;
// 使用 sizeof 获取数组 str 的大小(包括所有字符和结束符 '\0')
size_t sizeof_str = sizeof(str);
printf("Size of str (including null terminator): %zu bytes\n", sizeof_str);
// 使用 strlen 获取字符串 str 的长度(不包括结束符 '\0')
size_t strlen_str = strlen(str);
printf("Length of str (excluding null terminator): %zu characters\n", strlen_str);
// 使用 sizeof 获取指针 ptr 的大小(不是它指向的内容的大小)
size_t sizeof_ptr = sizeof(ptr);
printf("Size of ptr (pointer size): %zu bytes\n", sizeof_ptr);
// 注意:不能直接对 NULL 指针使用 strlen,因为这会导致未定义行为
// 但可以对 NULL 指针使用 sizeof
char *null_ptr = NULL;
size_t sizeof_null_ptr = sizeof(null_ptr);
printf("Size of null_ptr (pointer size): %zu bytes\n", sizeof_null_ptr);
// strlen(null_ptr); // 这行会导致程序崩溃或未定义行为,不要这样做
return 0;
}
在这个例子中,我们定义了一个字符数组 str 和一个指向这个数组的指针 ptr。我们使用 sizeof 来获取 str 数组在内存中的大小(包括所有字符和结尾的空字符 '\0'),以及 ptr 指针的大小(这通常取决于你的系统是 32 位还是 64 位)。对于 str 数组,我们还使用 strlen 来获取字符串的长度,即不包括结尾的空字符 '\0' 的字符数。
注意,sizeof 运算符返回的是数组的总大小(以字节为单位),而 strlen 函数返回的是字符串的长度(以字符为单位,不包括结束符)。对于指针 ptr,sizeof 返回的是指针变量本身的大小,而不是它所指向的字符串的大小。
最后,我们尝试对一个 NULL 指针 null_ptr 使用 sizeof,这是安全的,并且返回的是指针类型的大小。但是,我们注释掉了对 null_ptr 使用 strlen 的尝试,因为这会导致未定义行为(通常是程序崩溃)。