区别

strlen执行的是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符’\0’为止,然后返回计数器值。

sizeof是C语言的关键字,它以字节的形式给出了其操作数的存储大小,操作数可以是一个表达式或括在括号内的类型名,操作数的存储大小由操作数的类型决定。

字符串字面值

定义:用双引号(“”)括起来的0个或者多个字符组成的序列

存储:每个字符串尾自动加一个 ‘\0’ 作为字符串结束标志

对于用字符串字面值初始化的数组,sizeof()是引号里面定义总字符个数+1,strlen()是引号里面定义的总字符数。注意转义字符和后面的紧跟的字符算作一个。

1
2
3
4
5
6
char q[]="abc";  
char p[]="a\n";  
sizeof(q);      4  
sizeof(p);        3  
strlen(q);        3       
strlen(p);        2  

特殊情况:

1
2
3
4
char a[]="abc\0";
char b[] = "12\03456";
cout << strlen(a) << "," << sizeof(a) << endl;        //3,5 
cout << strlen(b) << "," << sizeof(b) << endl;        //5,6 

解析:

对于数组a,strlen()只计算到出现‘\0’为止,所以为3,而sizeof()不光计算初始化时人为输入的’\0’,还计算字符串尾自动加的 ‘\0’,所以为5

对于数组b,需要考虑转义序列:

当反斜线后面跟着的八进制数字(必须以0开头且包括0)超过3个(0以后的每一位数都要小于8,才能代表正确的八进制数),只有前3个数字与反斜线构成转义序列.

当反斜线后面为x,则代表十六进制数字,需要包含后面所有紧跟的数字 数组b中经过转化,实际为“12?56” 一共5个字符

特殊情况:‘\000’代表‘\0’,此时数组b变成“12\056”,此时strlen()为2,sizeof()为6,不管’\0’出现在哪里,字符串字面值最后都会自动补一个‘\0’

char s[]="12\00056";
printf("%d\n%d\n",strlen(s),sizeof(s));        //2,6