【嵌入式-LinuxC】一文带你搞清楚sizeof和strlen怎么计算字符串长度的
废话不多说,直接上代码~
#include<stdio.h>
#include<string.h>
int main(int argc, char *argv[])
{
// 这里分配给数组的长度为3,实际给到了7个字符数组,因此sizeof为3。当计算机分配了3个长度后,将不再把随后的值继续填充了,因此strlen实际上长度是随机的,遇到下一个\0就可以得到实际strlen长度。在我计算机上,始终看到的strlen是6,并且输出字符都是一摸一样的。
char s0[3] = {'a', 'p', '0', 'p', '\0', 'l', 'e'};
// 这里算的sizeof为初始化的空间大小,为10,strlen为遇到\0的长度-1,是5-1=4
char s1[10] = {'a', 'p', '0', 'p', '\0', 'l', 'e'};
// 这里转义字符\不要当作一个字符,而要跟后面的符号一起算。因此sizeof总共空间是12, 但strlen遇到\0则结束,因此strlen算的是3
char s2[] = "\t\\\%\0\\0mike\n";
// 这里ASCII 8进制最大值是177,\180超过8进制数,此时按照\1和80算,因此此时有6个字符.sizeof算出6,strlen则是5
char s3[] = "\180\x99\n";
// 这里\150没有超过ASCII码8进制最大值,因此算1个字符。sizeof算出4个字符。strlen则是3个字符
char s4[] = "\150\x99\n";
printf("sizeof(s0)=%ld, strlen(s0)=%ld\n", sizeof(s0), strlen(s0));
printf("sizeof(s1)=%ld, strlen(s1)=%ld\n", sizeof(s1), strlen(s1));
printf("sizeof(s2)=%ld, strlen(s2)=%ld\n", sizeof(s2), strlen(s2));
printf("sizeof(s3)=%ld, strlen(s3)=%ld\n", sizeof(s3), strlen(s3));
printf("sizeof(s4)=%ld, strlen(s4)=%ld\n", sizeof(s4), strlen(s4));
for(i = 0; i<6; i++)
{
printf("s0[%d]=%c, p=%p\n", i, s0[i], &s0[i]);
}
return 0;
}
/*
结果如下:
sizeof(s0)=3, strlen(s0)=6
sizeof(s1)=10, strlen(s1)=4
sizeof(s2)=12, strlen(s2)=3
sizeof(s3)=6, strlen(s3)=5
sizeof(s4)=4, strlen(s4)=3
s0[0]=a, p=0x7fff5aabca25
s0[1]=p, p=0x7fff5aabca26
s0[2]=0, p=0x7fff5aabca27
s0[3]=h, p=0x7fff5aabca28
s0[4]==0x7fff5aabca29
s0[5]=
, p=0x7fff5aabca2a
总结:
sizeof计算实际分配给变量的字节数.只按分配的空间计算,不考虑\0、\t等各种特殊字符
strlen计算实际的字符数,遇到\0即停止计算,并且\0不计算在strlen之内。\t、\\、\%等各种转义字符当作一个字符计算.
在字符串"a\180\140\0x66"这种包含8进制和16进制的数据中,在范围内的数据只算作1个字符,也就是一个字节。超出范围的,只算\1和80,即只算\后面第一个字符当作一个转义字符,加上80两个,为3个字符。16进制应该是同理的。并且字符串"xxxx"是默认最后有个\0,因此sizeof("xxxx")应该是4,而strlen应该是3.
*/