- strlen()函数用于统计字符串长度,使用前应包含string.h头文件,其原型如下:
size_t strlen( char const *string );
返回值类型为size_t,它是一个无符号整数类型,在头文件中typedef为unsigned int 类型,实现函数为:
size_t strlen( char const *string )
{
int length;
for( length = 0; *string++ != '\0'; )
length += 1;
return length;
}
- sizeof()是运算符,并没有原函数,返回值对应一个对象或者类型所占的内存字节数,用法:
sizeof (类型说明符)
- 比较:
sizeof | strlen | |
---|---|---|
返回值 | 无符号整型 | 无符号整型 |
参数 | 类型说明符/函数(其返回值类型) | 字符串(数组)指针 |
性质 | 运算符 | 函数 |
返回值说明 | 类型占内存大小 | 字符串长度(不含结尾符) |
- 要点区分:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void size_str( char *test )
{
//仅测量指针的大小,与cpu有关,32位:4byte 64位:8byte
printf("sizeof %s = %d byte\n",test,sizeof(test));
printf("strlen %s = %d byte\n",test,strlen(test));
}
int main()
{
char *string1 = "ZRong1";
char string2[30] = "ZRong2";
size_str(string1);
size_str(string2);
printf("sizeof %s in main = %d byte\n",string2,sizeof(string2));
return 0;
}
输出结果:
比较有意思的是:数组名作为参数传递给size_str函数测出的字节大小为4,而在main函数中测出为30字节(通过sizeof)。应该注意到调用函数时实际传递的是一个指针,string2是一个数组,test是一个指向string2数组首元素的指针。所以,sizeof ZRong2 的值应该是字符指针的长度,而不是数组的长度。
编译器同时也接受数组形式的函数形参,所以下面这两个函数声明是等价的
void size_str( char *test ); <==> void size_str( char test[] );
(指针,类型sizeof长度可以参考 C重温学习(1) ------ 数据类型 的总结)