第四章:字符串与转义字符

C语言学习之路

第一章 初识C语言
第二章 变量
第三章 常量
第四章 字符串与转义字符



前言

随着前三章的学习,我们了解到了变量和常量的概念。本章将基于字符型变量,引出字符串的概念。希望大家能有更深的印象。同时,带领大家学习什么是转义字符。


一、字符串

1、初识字符串:

在数学中,我们曾经学过集合的概念。当集合的元素中是数字时,我们称之为“数集”。那么在计算机中,当集合中的元素都是字母时,我们就称之为字符串。

2、语法:

(1)char 字符串的名称 [] ={'a','b'...};

这种基于定义的方式是最容易理解的。这就是在计算机中表示集合的语法。但是在计算机中,相同类型的元素组成的集合称之为“数组”。
这里我们可以先渗透一下数组的语法形式:数据类型 数组名称 [元素个数 ]={元素};

(2)char 字符串名称 [] ="abcde";

这种形式比较常用,也比较好用,并且不容易出现bug,至于会出现什么bug,下文会提到。这种形式值得注意的是,其语法中写的是双引号,但是在创建一个字符型变量时,我们用的是单引号。

3、字符串的输出:

(1)代码示例:

#include<stdio.h>
int main()
{ 
   char arr[]="abc";
   char arr1[]={'a','b','c'};
   printf("%s",arr1);
   printf("%s",arr);
   return 0;
}

(2)代码详解:

我们发现整体的输出思路是不变的,我们都利用到了库函数printf()。同时,我们输入了一个占位符,但是当我们输出字符串时,其占位符是%s

4、bug解决:

(1)bug来源:

a、现象:

那么会出现什么bug呢?倘若你执行了我上面提到的语法,我们会发现两个数组的输出结果是不一样的。arr的结果就是abc。但是,arr1的结果会出现乱码。这是为什么呢?

为了了解这个bug的来源,我们可以先了解一下如何计算字符串的元素个数。

b、元素个数的计算方式1:

在之前的章节中,我们了解到,想要计算一个变量的内存大小,可以利用操作符sizeof()。这里我们需要拓展的是,当我在括号内输入字符串的名称时,计算的是整个字符串的所占内存大小。倘若我们括号内填入的是数组名称 [0] 。时,计算的就是第一个元素的所占内存大小。这里我们需要注意的是,计算机是按0开始标号的。

接着,根据我们小学学过的数学知识,我们自然就能推导出,如何计算一个数组中的元素个数,即sizeof(arr)/sizeof(arr[0])。那么我们按照这种方式,计算上述两个数组的元素个数。

c、bug出现的原因:

经过计算,我们会发现以第二种方式定义的数组个数为4。第一种定义的数组个数为3。但是,我们仅仅输入了三个字符,abc。这说明什么呢?

说明,第二种定义方式其字符串中,存在着一个隐身的元素,由于它的存在使得最终的输出结果不是乱码。

那么在这里我就直接介绍这个隐藏的元素:\0。这个形式就是我们稍后介绍的转义字符,这个转义字符的意思就是让字符串,停止打印。当我们采用第二种方式定义数组时,编译器便会补充一个该字符。但是第一种方式不会,这就导致第一种会一直往后打印,但是后面的内容我们是不知道的,直到其打印到\0时,才会停止。

(2)bug的解决:

a、解决方案

那么当我们知道了该bug的来源后,解决就相当轻松了。我们直接在第一种定义方式的大括号内的末尾补充一个'\0'即可。

b、元素个数的计算方式2:

但是我们会发现,打印的结果就是3个,可是计算结果是4个,难免引起歧义,所以,我们的C语言中引入了一个函数strlen(数组名)

(3)strlen函数和操作符sizeof的区别:

首先在本质上,strlen是一个函数,而sizeof仅仅是一个操作符。但是我们知道二者都可用来计算一个数值结果。
在思考二者其余区别之前,我们先判断一下下面的结果。
在这里插入图片描述
我们不妨思考一下这个代码最终的输出结果。当我们运行代码后,将出现如下结果:
在这里插入图片描述
根据我们刚才的了解,strlen在计算一个字符串的长度的时候,会不断地向后找\n。找到0之后,才会结束strlen函数的计算。但是按照这个逻辑,sizeof的计算结果为什么就是3而不是15呢?
这就涉及到二者的计算方式的问题。sizeof计算时,只关注这个数组所占的内存大小,并不关注这个数组中的具体内容。arr数组中有abc三个字符,每个字符占一个字节,所以arr所占的内存是3。同理,arr1数组中,包含有abc和\0所以其中有四个字符,每个字符占一个字节,则所占内存空间为4。我们会发现这一套计算逻辑与数组的内容毫无关系。
那么我们再来讨论一下,strlen函数的计算逻辑。首先,这个函数并不是计算内存空间的,而是计算字符串内的元素个数的。只不过由于字符型变量的所占空间是一个字节,所以导致二者在某些情况下的结果在数值上保持一致。另外,在计算的时候,strlen的计算逻辑是,在扫描字符串的内容,找到字符串末尾的\0时,才会停止函数的计算。因此我们就会发现,这个函数的计算是与字符串的内容有关的。因此才会出现当字符串末尾不含\0时,其计算结果是随机数。
在这里插入图片描述

int a=strlen(arr);
printf("%d", a);

这个函数的返回值就是元素的个数,我们将这个结果赋值给a,其结果就是我们所想的3,即刨除了0。

二、转义字符:

1、定义:

转义字符就是利用语法\其他的方式,表示一些特殊的含义。

2、常用的转义字符:

\n换行
\t水平制表
\ \斜线
\’单引号
\ "双引号

总结

这一章,我们了解了两件事情,一是字符串,二是转义字符。希望大家能够熟练掌握。

我走的很慢,但是我从不后退。
——林肯

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值