表面上看它们都可以求字符串的长度,但二者却存在着许多不同之处及本质区别。
strlen
size_t strlen ( const char * str );
- strlen是函数
- 字符串用 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(**不包含 ‘\0’ **)。
- 参数指向的字符串必须要以 ‘\0’ 结束,负责会一直往后寻找,直到碰见’\0’才会停下,此种后果会返回一个随机值。
- 注意函数的返回值为size_t,是无符号的( 易错 )。
- strlen只能用char*做参数,且必须是以’’\0’'结尾的。
- 数组传递给strlen就退化为指针了。
因为strlen返回值为无符号类型,优先级高于有符号类型,和有符号类型进行运算时会进行类型转换,所以strlen只能比较,不能参与运算,否则会造成不可预知的后果。
错误示例一:
if (strlen(x) - strlen(y) >= 0) //最终结果会转换为无符号类型,条件永为真。
{
}
错误示例二:
if (strlen(x) - 7) >= 0) //最终结果会转换为无符号类型,条件永为真。
{
}
正确示例一:
if(strlen(x)>= strlen(y))
{
}
正确示例二:
if(strlen(x)>= 7)
{
}
sizeof
sizeof (类型说明符) 类型必须加括号,如果是变量名可以不加括号
sizeof 表达式
- sizeof 是关键字/单目运算符,是计算变量或者类型所占内存大小的关键字(返回以字节为单位的大小),而不是一个函数。与函数 strlen 不同,它的参数可以是数组、指针、类型、对象、函数等。
- 返回字符数组大小的时候,包括’\0’。
- 编译时有效,由于sizeof是在编译时计算,因此 sizeof 不能用来返回动态分配的内存空间的大小。
- 数组做sizeof的参数不退化。
多说无益,做几道小题练练手,加深理解:
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr+0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr+1));
printf("%d\n", sizeof(&arr[0]+1));
printf("%d\n", strlen(arr));
printf("%d\n", strlen(arr+0));
printf("%d\n", strlen(*arr));
printf("%d\n", strlen(arr[1]));
printf("%d\n", strlen(&arr));
printf("%d\n", strlen(&arr+1));
printf("%d\n", strlen(&arr[0]+1));
char arr[] = "abcdef";
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr+0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr+1));
printf("%d\n", sizeof(&arr[0]+1));
printf("%d\n", strlen(arr));
printf("%d\n", strlen(arr+0));
printf("%d\n", strlen(*arr));
printf("%d\n", strlen(arr[1]));
printf("%d\n", strlen(&arr));
printf("%d\n", strlen(&arr+1));
printf("%d\n", strlen(&arr[0]+1));
char *p = "abcdef";
printf("%d\n", sizeof(p));
printf("%d\n", sizeof(p+1));
printf("%d\n", sizeof(*p));
printf("%d\n", sizeof(p[0]));
printf("%d\n", sizeof(&p));
printf("%d\n", sizeof(&p+1));
printf("%d\n", sizeof(&p[0]+1));
printf("%d\n", strlen(p));
printf("%d\n", strlen(p+1));
printf("%d\n", strlen(*p));
printf("%d\n", strlen(p[0]));
printf("%d\n", strlen(&p));
printf("%d\n", strlen(&p+1));
printf("%d\n", strlen(&p[0]+1));
PS:想对答案的话,粘贴到编译器里面运行一下(每天做一遍,防止抑郁)。
越努力,越幸福!