strlen
获得字符串的长度(string length)
函数基本原型
size_t strlen( const char *string );
参数解读
参数 | string |
解释 | 要获取字符串长度的地址 |
返回值详解
返回的是size_t类型的值,size_t是无符号整数,这里要注意如果用返回值进行减法运算的话可能会出错
以下列代码为例,大家猜猜结果是啥
#include<stdio.h> #include<string.h> int main() { char str1[] = "Hello"; char str2[] = "Bit"; if (strlen(str2) - strlen(str1) >= 0) { printf("str2 > str1"); } else { printf("str2 < str1"); } return 0; }
很明显str1中字符串的长度比str2中的字符串长,大家可能感觉结果是打印"str2 < str1",但是实际上结果恰恰相反
为什么是打印"str2 > str1",别急且听我慢慢讲解。
我们先看strlen(str2)和strlen(str1)的值,分别是3和5。而3-5=(-2)是个整数呀,为什么会大于零呢?这就要讨论strlen(str2)和strlen(str1),因为strlen返回值是无符号整数,所以(3)和(5)也是无符号的,所以(3-5)也是无符号整数。
大家估计都知道有符号正整数在计算机存储是原码(下面都是以二进制代码为例)
3的原码:00000000000000000000000000000011
5的原码:00000000000000000000000000000101
有符号负整数在计算机内存储的是补码
-2的原码:10000000000000000000000000000010
-2的反码:11111111111111111111111111111101(原码取反)
-2的补码:11111111111111111111111111111110(反码加1)
第一位为符号位,当一个数存储在计算机内时,计算机都会检测第一位判断这个数是否为正整数或是负整数,而无符数计算机则不判断直接进行转换。
如下,(-2)打印出来是4294967294,是一个超级大的数。
这也是为啥例题能打印出"str2 > str1"的原因。
函数用法详解
见到strlen函数我们可能会想,它是怎么求字符串长度的呢?
当我们给出一个字符串"abcdef"时,这个字符串末尾其实隐藏一个‘\0’做结束标志。
"abcdef"={' a ',' b ',' c ',' d ',' e ',' f ',' \0 '}
而strlen()函数找到字符串的其实位置一直往后找,一直找到‘\0’为止。
专业也是strlen函数一个基本工作原理
#include<stdio.h> #include<string.h> int main() { char str[] = "abcdef"; printf("%d", strlen(str)); return 0; } 还有一种情况,没有‘\0’时,如下。 #include<stdio.h> #include<string.h> int main() { char str[] = { 'a','b','c','d','e','f' }; printf("%d", strlen(str)); return 0; }
还有一种情况,没有‘\0’时,如下。
#include<stdio.h> #include<string.h> int main() { char str[] = { 'a','b','c','d','e','f' }; printf("%d", strlen(str)); return 0;
这里打印的是19,为什么是19呢?abcdef是放到数组str里面的,数组只申请6个空间。而strlen也是倔脾气,只找到‘\0’才返回值,而在‘\0’之前可能出现19非'\0'的字符。所以才打印了19。这个19是个随机值,我们也不知道下次'\0'之前有多少多字符。
所以,让strlen求字符串时,参数所指向的字符串必须以‘\0’结束。
当我们自己放入一个‘\0’时,就会打印正常值了。
当然,当指定数组大于6,也是可以的
当把abcdef放到str[10]中时,只初始化前6个空间,而后四个空间编号一起会默认初始化为'\0'。
希望大家能够注意以上几点。