C语言 关于字符串‘\0‘的小细节


字符串的概念

在C语言中,所谓的字符串,就是一个字符型的数组,可以看作多个字符组合在一起,我们将它理解为字符串

eg: “abcd”


字符串的定义

字符串的定义有两种方式:

  1. char s1[ ] = “abcd”;
  2. 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)


如有任何问题,欢迎评论…
在这里插入图片描述