新人第一篇博客,解析字符串和\0之间的关系

  Hello,大家好!本人目前准大一学生,所学专业是软件开发,目前在自学c语言,我会将自己从零学习的心得体会以及后期所做的项目一一整理发布,供大家参考指正。一是想能够记录自己的成长历程,二则是希望能够将自己的经验分享给大家,如果能够对大家有帮助,那就赚啦!!

目录

  认识字符串

字符串和\0的关系


  认识字符串

在c语言中,使用双引号括起来的一串字符就被称为字符串,如“abcde”就是一个字符串

int main()
{
  "abcde"//用双引号括起来的一串字符叫字符串
  "a"//用双引号括起来的一个字符也叫字符串
  ""//当双引号内无内容时,称为空字符串
  return 0;
}

字符串可以使用“%s”指定,也可以直接打印,如下:

#include <stdio.h>
int main()
{
  printf("%s", "abcde");//第一种是使用占位符%s指定打印字符串。
  printf("abcde");//第二种是直接打印字符串。
  return 0;
}

运行如下:

 (为了方便对比,我添加了\n,换行)

 可以看到两种方法输出结果一致。

字符串和\0的关系

直接说结论: 字符串的末尾隐藏着一个\0,\0也是字符串结束的标志。

如何理解呢?接下来我将用代码来演示:

    1.  首先我们要证明字符串的末尾隐藏着一个\0,故先设定字符串“okey”,可以清晰的看到其中有四个字符,此时并不能直接观测到\0,所以开始调试代码且监视该字符串,观测结果如下:

   可以看到,此时字符串“okey”中含有五个字符,分别为‘o’,‘k’,‘e’,‘y’,‘\0’,故证实字符串末尾隐藏着一个\0。

    2.  而关于\0是字符串的结束标志,我觉得使用代码进行描述比较直观,同样是设定字符串“okey”,代码如下:

int main()
{
	char arr1[] = "okey";//创建数组arr1,存放字符串
	char arr2[] = { 'o', 'k', 'e', 'y' };//创建数组arr2,存放4个字符

	return 0;
}

  首先通过调试分别监视这两个数组当中的字符,如下:

  可以观测到,存放字符串的数组arr1中含有5个字符,正好与上面所证的论点相呼应,而存放4个字符的数组arr2中则中规中矩的含有4个字符。接下来使用库函数“printf”将其输出,输出结果如下:

   我们发现arr1所打印出来的正是我们想要的输出结果,而arr2所打印出来的却含有乱码,此时就不得不提到“\0”的作用了,在前文中提到“\0”是字符串的的结束标志,上图曾观测到arr1中含有5个字符,分别是’o',‘k',’e‘,’y‘,’\0‘,而arr2中只含有’o',‘k',’e‘,’y‘这4个字符,故我们可以做出以下推测:

  “假定\0是字符串的结束标志,而刚才使用printf输出是指定了字符串(%s)类型,所以可以想象出这些乱码的出现过程,如下

 

 黑框是arr1在计算机内存中的状态,当使用printf输出指定了字符串类型打印时,由o开始到\0结束,输出结果为“okey”

 绿框是arr2在计算机内存中的状态,当使用printf输出指定了字符串类型打印时,,由o开始到y却后并未遇见\0,故一直向后打印,直到遇见\0后才输出完成,故输出结果为“okey+乱码”

   ”

  证明该推测也很简单,只需要在arr2数组中加入’\0‘,再执行打印,代码如下:

#include <stdio.h>
int main()
{
	char arr1[] = "okey";
	char arr2[] = { 'o', 'k', 'e', 'y', ’\0‘};//在arr2中加入字符’\0‘
	printf("%s\n",arr1);
	printf("%s\n",arr2);
	return 0;
}

  输出结果如下:

   可以看到,在加入字符’\0‘,后,两组数组输出结果一致,遂证明推测成立。

  同时我们也可设定一段代码,来验证,代码如下:

#include <stdio.h>
int main()
{
printf("abc\0def");//在abcdef中放置\0,若\0是字符串的结束标志,那么输出结果应是abc。
return 0;
}

  输出结果如下:

   可以看到,我们的想法又一次得到了证实。

   好啦,今天的分享完毕,感谢各位的观看!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值