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 | 水平制表 |
\ \ | 斜线 |
\’ | 单引号 |
\ " | 双引号 |
总结
这一章,我们了解了两件事情,一是字符串,二是转义字符。希望大家能够熟练掌握。
我走的很慢,但是我从不后退。
——林肯