C语言 关于字符串‘\0‘的小细节
字符串的概念
在C语言中,所谓的字符串,就是一个字符型的数组,可以看作多个字符组合在一起,我们将它理解为字符串。
eg: “abcd”
字符串的定义
字符串的定义有两种方式:
- char s1[ ] = “abcd”;
- char s2[ ] = {‘a’,‘b’,‘c’,‘d’};
如果你认为上面两种定义看似没什么区别,那么你可就大错特错了。
这里我们将引入'\0'(字符串结束标志)这个转义字符的概念。
举例1
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
char s1[]="abcd"; //方式1定义,默认结尾处补充一个'\0'
char s2[]={'a','b','c','d'};//方式2定义,不会补充'\0'
printf("s1 大小 %d\n",sizeof(s1));
printf("s2 大小 %d\n",sizeof(s2));
}
结果

解析:
1.这里sizeof() 分别计算s1,s2的大小,发现s1除了’a’,‘b’,‘c’,‘d’,四个元素外,还多了一个元素,根据监视窗口,可以证明多出来的元素就是'\0'
2.用方式2定义的s2的大小为4,证明没有自动在末尾追加
'\0'
那么我们为什么要研究'\0'这个东西呢?
举例二
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
char s1[]="abcd"; //方式1定义,默认结尾处补充一个'\0'
char s2[]={'a','b','c','d'};//方式2定义,不会补充'\0'
printf("s1 长度 %d\n",strlen(s1));
printf("s2 长度 %d\n",strlen(s2));
}
结果

解析:
1.strlen() 是头文件 <string.h>所包含一个库文件,作用是求一个字符串的长度(注意长度区别于大小),方式1中 末尾追加的'\0'会算入大小中,但是不会算入长度中,因为strlen()就是通过遇到'\0',才停止计算长度的。
2.因为s1 四个字符 ‘a’,‘b’,‘c’,‘d’, 之后有‘\0’,因此strlen()正常计算 长度为4
3.s2中因为末尾没有追加
'\0',因此strlen()会一直向后找'\0',谁也不确定在何处恰好存在一个'\0'使其停下,因此该长度为一个随机值!
经典例题
牛客网链接: link.(迅雷笔试)

答案:输出 “a<=b” 即strlen(a)<=strlen(b)
解析
strlen()计算字符串长度 是根据 遇到内存中的’\0’ 进而停止计数的!
因此 char a[]=“xyz” , a中(上文所说第一种方式定义)存放四个元素 ‘x’ ‘y’ ‘z’ ‘\0’ , 则strlen(a)= 3
但是 b中 (
上文所说第二种方式定义)只有 ‘x’ ‘y’ ‘z’ 三个元素 {后面为随机值!} 因此 strlen(b)往后找'\0'停止时候,必然strlen(b) >=3了,y
“如果恰好最后一个’z’ 后面的随机值是’\0’ 那就等于3 ,否则就大于3”
因此strlen(a)<=strlen(b)
如有任何问题,欢迎评论…
