字符串的初步认识

字符串

b站鹏哥p8

定义
字符是一种常用的数据类型,可以是单个的数字,字母和符号以及其他可打印的符号
由上一章学过,加单引号的数字、字母为一个字符常量

int main()
{
    10;
    Q;
    'a';
    char zf ='a';
    return 0;

以上为字符,char为字符类型
单个的我们称作字符,如果是多个数字、字母组成则为“字符串”(也叫字符串字面值)
而字符串没有相对应的数据类型,但是字符串通常同双引号引起来,比如

"hello world!"

那么如何储存字符串呢?
这里可以用**arr[ ]**数组来储存(又是提前了解一下数组)

#include <stdio.h>
int main()
{
	char `arr[10]` = "abcd";
	return 0;
}

在这里面,char arr[10] 是表示字符类型的的数组
其中,arr[10] arr后的括号里的“10”表示这个数组arr可以储存10个字符,也就是有10个字节的储存空间,对存储这个“abcd”字符串来说绰绰有余,所以能够储存
如果括号里是20就表示可以储存20个字符

注意:假设不知道后面有几个字符,可以在arr数组的括号里不加入任何数字arr[],这样数组会根据后面字符的多少自动来提供所需的储存空间

但是“abcd”我们存储了几个字符?占据了几个字节?

我们在原来代码的基础上进行操作,先按一次“F10”,进行调试,这时候vsc页面上会出现一个正方形小红点,代表正在调试(如果点击小红点就会停止调试)

在这里插入图片描述
这时候,vsc的那一列序号旁会出现一个黄色箭头,这时按几下F10箭头就会走几行代码,我们按两下将箭头走到“return 0;”,这步对后面很关键

在这里插入图片描述
然后,我们再点击页面上的“调试”,点击“窗口”,再打开“监视”

在这里插入图片描述
这时出来四个监视窗口,任意点击其中一个就行

在这里插入图片描述
进入监视之后,点击“添加要监视的项”那输入数组“arr”,然后点击其旁边的小三角,接下来就会展示数组arr所储存的字符

在这里插入图片描述

这时候我们看[ ]里的序号从0到9一共有10个,这是因为先前我们给数组“arr[10]”里设置的字符存储数量就是10,所以在“abcd”之外存储的就会一直用“\0”(反斜杠0;/是斜杠)来显示,如果是一开始是“arr[ ]”,那么根据“abcd”字符的数量,只会显示序号[5]这一行有\0,
(这里还告诉们,一开始的那个黄色箭头要指到“return 0;”,不然监视的项就会出错)

这里的“\0”为转义字符,是字符串结束的一个标志,在计算字符串长度时\0是结束标志,不算作字符串的内容,但隐藏在字符串之中,一般也不会写入字符串中,当然写入也不影响正常运行;
值得注意的是,\0也是一个字符,也占据一个字节,但是\0是打印不出来的(指的是作为字符串结束标志的\0),主动在字符串后面加上\0也是不显示的,如果真想在字符串后面显示出\0,可以以char arr[] = "abcd\\0";这样的形式,不过这样该字符串就多了\和0这两个字节,最后这行字符串就一共时7个字节了
所以字符串"abcd"共有5个字符,占据5个字节

加不加\0对字符串有什么区别吗?

#include <stdio.h>
int main()
{
	char arr1[] = "abcd";
	char arr2[] = { 'a','b','c','d' };
	return 0;
}

这里我们先创建两个数组,第一个数组储存的是正常的字符串,第二个储存的是自己一个字符一个字符的主动添加进去的(字符常量),也就是没有\0
然后用上面的方法监视,会发现

在这里插入图片描述
arr1加上\0共显示5个字符,arr2没有\0只显示4个字符,这是数组储存的差别(形式上的差别)
我们再来打印输出,了解一下使用上的差别

#include <stdio.h>
int main()
{
	char arr1[] = "abcd";
	char arr2[] = { 'a','b','c','d' };
	printf("%s\n", arr1);//别忘了输出字符用%s
	printf("%s\n", arr2);
	return 0;
}

输出显示
在这里插入图片描述
这里看到arr1是正常输出字符串,arr2则是输出一段类似于乱码的东西
首先我们知道存储空间是一个非常大的空间,如果不设置结束标志,代码检测不到从哪里结束就会一直运行,所以就会出现乱码
而此时我们如果char arr2[5] = { 'a','b','c','d'};在数组括号里加入4以上的数字(因为后面添加了4个字符,4以下就会报错),运行就是正常的,这时因为原本数组括号什么都没有,所以它会自动根据后面字符的数量给予相应的存储空间,但是因为没有\0,代码不知道从何结束
而我们给数组定义了5个字节的存储空间,那么代码运行到第五个的时候就会没有空间,也就自动停止,也就是我们设置了一个空间限制,相当于我们定义了一个“结束标志”

这就是加不加\0在使用上的区别和原因
所以我们只要主动再添加一个结束标志char arr2[] = { 'a','b','c','d','\0'};这样也会正常运行,在形式上也是正常的

此处在拓展一下,
先认识一个库函数“strlen”,与其对应的函数头为“<string.h>”,用于计算字符串的长度(不包括结束符\0),不能计算字符常量,但是可以计算一个字符的长度,不过不能用'a',要用"a"
strlen计算字符串的长度需要先将字符串赋值给某个东西,再加入进strlen后面的括号里,使用形式如下

#include <stdio.h>
#include <string.h>//使用strlen函数时必须要有该头文件<string.h>
int main()
{
	int n = strlen("abcd");//字符串别忘记加双引号
	printf("%d\n", n);
	return 0;
}

//输出:4

这里能够看到strlen函数计算的字符串“abcd”长度为4,这里并没有包含\0,因为strlen函数在检测字符串函数时碰到结束标志\0就会在此停止,上面也说过\0本身就是不算作字符串内容的

记住这一点,strlen函数是在碰到结束符号\0时才会停止,如果没碰到呢?
我们将上面的两个数组用strlen函数运行一下

#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[] = "abcd";
	char arr2[] = { 'a','b','c','d' };
	printf("%s\n", arr1);
	printf("%s\n", arr2);
	printf("%d\n", strlen(arr1));
	printf("%d\n", strlen(arr2));
	return 0;
}

//输出:abcd
//……乱码
//4——arr1的结果
//33——arr2的结果

这里我们知道arr1、2分别代表有无\0,用strlen函数运行arr1时输出结果为4,符合正常带\0的字符串abcd的长度;而运行arr2时,输出结果为33,这里并不是代表字符长度为33(不同的电脑或者是编译器是随机的),而是因为arr2没有结束标识,在程序运行的时候检测了好久才“算是结束”,当然在arr2里面加上\0九个就是正常的。

到这,对字符串的初步认识就此结束

作者来牢骚两句
我在博客之前就已经学了一点点的C语言知识,但是是按照课本目录学的,速度也很慢,只学到函数的调用的那一块(还没学懂),但开始学之后想着能不能进一步学习,输入连书本上的都没学完,但也算是有了些小小的基础,所以就看B站鹏哥的视频学,顺便练练写博客。
其实,这个鹏哥的课是我学C语言一开始就找的课,但是感觉需要些基础,所以一开始我并没有跟着他学,而是另一位老师lzq,这位老师是从基础教起的很不错。到3月初开学的时候,想着一边学一边提升一下,就准备跟着鹏哥学了,不过学校这学期开始缴C语言了,我也值学了一点点,所以在上课之前都准备刷lzq老师的课来提前预习。
当然为学习速度可谓是非常慢的,十几分钟的课程我可能要用一天,期间还写博客,比如这边博客可能写了我两个多星期,很丢脸,可能就是这个人本来就很集中注意力,影响学习效率,而且这学期在学校多了一份职务,时间就更难规划了,当然可能是我本身就很懒,以后也是打算要逐步克服,需要学的东西还是很多的,但是时间又很少,所以更需要规划利用好自己的时间了。

  • 45
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值