今天我将开始分享字符串、转义字符、注释这些内容的相关知识以及我自己在学习过程中对这些知识的一些见解。
字符串
字符串定义
定义:由双引号引起的一串字符称为字符串字面值,简称字符串。
如:“hello world”、“abcd”、“atm”、“as”、“a”等这些双引号中间的单个字符或多个字符组合就叫字符串。
个人理解
这里我理解的是字符串就好比糖葫芦串、烧烤串等这些一串一串的食物,双引号就相当于是把这些食物串起来的竹签,里面的字符以及空格就是串在竹签上的牛肉、羊肉等。这里细心的朋友就会发现我这里有提到空格,没错,在计算机的世界中空格也是一个字符。
那下面我有个问题如果双引号中间什么都没有,这能叫做字符串吗?
答案是能称为字符串,它的名字叫空字符串(“”)
这里我还是以烧烤串来理解这个定义,空字符串就好比有人吃烧烤就喜欢吃皇帝的烧烤串,美名其曰炭烤竹签,别问为什么不是铁签,问就是烫嘴。只有一个字符的字符串就好比那些小串,10元一把的那种,上面都只有一串肉,两个及以上的字符串就是正常的烧烤串了,你想串多长就串多长,这取决于你竹签的长度。
那下面就由朋友问了,这个不同的字符串它的长度是多长呢?接下来我们就来探讨一下:
字符串的长度
计算字符串长度
下面我们引用一个库函数——strlen——string length——计算字符串的长度的函数。
我们在定义字符串时用到的数据类型是字符类型——char,为了更加直观的介绍字符串的长度,这里我们借用定义数组——arr[]来理解与字符串相关的一些知识点。
第一个问题,不同字符数量的字符串的长度是多少?编写计算字符串长度的代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
char arr1[] = "";//将""赋值给字符数组arr1
char arr2[] = " ";//将" "赋值给字符数组arr2
char arr3[] = "a";//将"a"赋值给字符数组arr3
char arr4[] = "as";//将"as"赋值给字符数组arr4
char arr5[] = "atm";//将"atm"赋值给字符数组arr5
char arr6[] = "abcd";//将"abcd"赋值给字符数组arr6
char arr7[] = "hello world";//将"hello world"赋值给字符数组arr7
printf("%d\n", strlen(arr1));//计算字符数组arr1的字符串长度并以整型打印
printf("%d\n", strlen(arr2));//计算字符数组arr2的字符串长度并以整型打印
printf("%d\n", strlen(arr3));//计算字符数组arr3的字符串长度并以整型打印
printf("%d\n", strlen(arr4));//计算字符数组arr4的字符串长度并以整型打印
printf("%d\n", strlen(arr5));//计算字符数组arr5的字符串长度并以整型打印
printf("%d\n", strlen(arr6));//计算字符数组arr6的字符串长度并以整型打印
printf("%d\n", strlen(arr7));//计算字符数组arr7的字符串长度并以整型打印
return 0;
}
在这个代码中我们定义了7个字符数组,分别存放了空字符串、有一个空格的字符串、有字符a的字符串、有字符as的字符串、有字符atm的字符串、有字符abcd的字符串和有字符hello world的字符串,运行结果如下图所示:
这里我们可以看到从空字符串到“hello world”字符串的长度分别是0/1/1/2/3/4/11这些数值分别对应的是字符串里字符的个数。
这里我们可以得出以下几个结论:
1.空格就是一个字符//从arr2与arr3打印出来的字符串长度能够得出此结论
2.strlen函数计算字符串长度的方式就是计算字符串里的字符个数
下面衍生出了一个新的问题,既然他这里字符串的长度就是他的个数,那我能不能将这些字符挨个赋值给字符数组呢?这里我们偷个懒,用“abc”来举例,分别将“abc”与‘a’、‘b’、‘c’分别赋值给字符数组arr1与arr2,代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
char arr1[] = "abc";//将字符串"abc"赋值给字符数组arr1;
char arr2[] = { 'a','b','c' };//将字符'a','b','c'赋值给字符数组arr2;
printf("%d\n", strlen(arr1));//将字符数组arr1的字符串长度以整型打印
printf("%d\n", strlen(arr2));//将字符数组arr2的字符串长度以整型打印
return 0;
}
运行结果如下:
这里我们可以看到我们将字符串赋值给字符数组时,他的字符串长度就是字符的个数,但是我们将字符分别赋值给字符数组时,他的字符长度不等于字符的个数,为什么会产生这样的结果呢?我们现在尝试着将这两个字符数组分别打印出来,看看这两个字符数组里面究竟有些什么内容,代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
char arr1[] = "abc";
char arr2[] = { 'a','b','c' };
printf("%d\n", strlen(arr1));
printf("%d\n", strlen(arr2));
printf("%s\n", arr1);
printf("%s\n", arr2);
return 0;
}
打印结果如下:
从打印结果中我们可以看到,字符串“abc”打印出来就是abc,但是字符‘a’,'b','c'打印出来却是abc烫烫烫烫蘟bc,为什么会出现这样的结果呢?难道这个arr2里面有什么不干净的东西?既然这样,我们来让他显出原形。
调试代码
我们按照下面的步骤来剖析他:
Ctrl+Fn+F10(编译代码)—>编译到第9行—>调试—>窗口—>监视—>监视1(任选一个就行)—>输入监视对象(arr1、arr2)—>展开
运行Ctrl+Fn+F10(编译代码)后计算机会从第6行开始编译代码每操作一次它就往下编译一行,这里我们编译到第9行
点击菜单栏里的调试,点击窗口,点击监视,在这4个窗口中任选一个,我这里选的是监视1
之后会出现需要输入监视对象的窗口:
这里我们输入arr1、arr2后展开监视对象:
这里我们看到了在arr1里面居然枚举出了4个字符分别是‘a’,'b','c','\0'但是在arr2里面只有我们输入的3个字符'a','b','c'那我们这里不妨尝试一下把这个缺少的字符给加进去看看会是什么结果,如图:
这里我们可以看到再加入这个字符‘\0’后打印出来的结果就是一样的了。
空字符串
前面咱们有提到空字符串,那我们不妨监视一下这个空字符串里面有没有字符,如下图所示:
这里我们可以看到空字符串里面原来并不是空无一物,他还是有点东西的,空字符串里面有字符'\0',既然他有东西的话我能不能把它打印出来呢?
这里我们可以看到在打印空字符串时,计算机并未打印任何内容,并且他打印出来的数值是0,由此我们可以得到以下结论:
1.字符串是在双引号内有单个或多个字符包括看不见的字符‘\0’组成的;
2.在计算字符串长度时字符‘\0’不计入字符串长度里;
3.我们可以大胆的推测字符‘\0’是字符串里的停止标志,也就是计算机在读取字符长度时读取到字符‘\0’就停止;
4.当我们将单个字符且并未将停止标志‘\0’赋值给字符数组时,计算机读取的字符长度时这个停止标志会随机出现。
由此可知,原来皇帝的烧烤串还是有东西的,只不过这个东西我们看不见,摸不着而已。
下面是鹏哥的板书上面的一句注释:
(注:字符串的结束标志是一个\0的转义字符。在计算字符串长度的时候\0是结束的标志,不算作字符串内容。)
咱们通过测试进一步证实了这句话,但是有一个地方大家需要注意,就是鹏哥这里提到了'\0'是一个转义字符,这个转义字符具体是什么东西呢?咱们将在下一篇内容里继续分享。
结语
到这里字符串的内容就给大家分享完了,如果这些内容能给各位朋友对这些知识点带来新的理解,那这些内容就完成了它的使命。接下来随着继续的深入的学习,我会继续给大家分享自己在学习上的感受,最后感谢大家的翻阅与支持,咱们下一篇见。