希望每一个想开始而又不敢开始的人,对任何知识都不要抱有恐惧,觉得它很神秘,那样不好,知识就在那里一动不动,一层薄纱,掀开它,你将看见新的世界。 ——我的实习老师
你一看你觉得你好像知道字符串是什么,但是当用的时候,可能会出现各种各样的错误,漏洞百出,希望能给予你帮助
1.字符串
1.1字符串的定义
由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符 串。
由单引号引起的为字符
#include <stdio.h>
int main()
{
'a'; //此为字符不是字符串,用单引号即可,但也可以用双引号代表单字符串
"abc"; //字符串需要用双引号,且单引号不能用
" "; //此为空字符串
return 0;
}
注:双引号可以对字符使用,也可以对字符串使用,但单引号只能对字符使用。
有点像之前看的营销号说找到一个暧昧对象你发现这人跟你真合拍聊什么他都能给你聊的很开心哈哈👬给的定论就是 ta 段位很高,降维打击,也就是向下兼容😆
屏幕前的你!!!你也一定可以成为那个知识渊博,温其如玉,向下包容的人嗷 😸
接下来我们就要来探讨一下字符串的长度了
1.2字符串的长度
此时我们要用到库函数strlen
注:strlen是用来求字符串长度的函数
步骤:先按F10进行逐过程调试,再打开监视窗口将数组的名字输入到名称字段下即可,如下图
图一是小编的反面教材。。。可能不会再有人像博主这样笨了。。。我一直在想为什么我的监视图如图一 一样,看不到值字段显示我的数组元素(a,b,c)的存放。
我之前真的无能狂怒了好久😱😱😱啊啊啊!你们别看了我好蠢🙈最后还是在大佬的指导下发现了哈哈哈哈哈😆😆😆
出现图一的原因就是F10之后进入逐过程调试阶段的时候,是一步一步的观察代码是怎么运行的
黄箭头指向代表将要执行的下一条语句
因此需要一直按F10键直到黄箭头指向从花括号前,移动 至 定义花括号arr3数组的下一行就代表调试过了,在监视窗口才可以看见每个数组的值字段是正常的,如图二
看到这里,我知道你很急,但你先别急👮 ✋ 👮✋ 👮✋
因为弄懂上面就可以开始讲啦!!!😺
![](https://i-blog.csdnimg.cn/blog_migrate/86acead69886ce90d0541110d3b1dbd9.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c2541178cb17e65d0755436bd2828939.png)
#include <stdio.h>
int main()
{
char ch = 'a';
char arr[] = "abc"; //结合图二可知\0不占长度,是字符串后默认放置的\0;
char arr1[] = "abc\0" ; //根据下面打印结果可知没有\0,且长度也只为3即可判断字符串;
char arr2[] = { 'a', 'b', 'c' };
/*arr2严格意义上为非字符串,只能算是多字符数组,因为定义的 char类型,所以会在开辟名为arr2的内存空间中不停的打印直到 打印至后续内存空间(中间出现任何奇奇怪怪的乱码都是正常的因 为谁也不知道后续内存都是什么字符)中第一个碰到的\0时停止;*/
char arr3[] = { 'a', 'b', 'c', '\0' };//'c'后直接放置\0,相较于arr2长度的增加和打印就戛然而止了
//看打印字符串的结果
//%c - 打印字符
//%s - 打印字符串
printf("%c\n", ch); //a
printf("%s\n", arr); //abc
printf("%s\n", arr1); //abc
printf("%s\n", arr2); //abc烫烫烫烫蘟bc
printf("%s\n", arr3); //abc
//求字符串的长度
printf("%d\n", strlen(arr)); //3
printf("%d\n", strlen(arr1)); //3
printf("%d\n", strlen(arr2)); //15
printf("%d\n", strlen(arr)); //3
return 0;
}
结合两图对比代码及代码注释的分析得出:
字符串的结束标志是一个\0的转义字符,在计算字符串长度的时候\0是结束标志,不算做字符串内容。
即 当我们打印字符串的时候,打印到\0就停止;
当我们求字符串长度的时候,也是要找到\0,统计的是\0之前出现的字符串个数。
🙋所以这里就不得不讲一下我们的转义字符啦🙈
👇👇👇
2.转义字符
讲述字符串的时候提到\0的转义字符,其实细心的你肯定也会发现我用的printf函数里面双引号内都会有一个\n,并为此疑惑:
为什么这里要有\n???,没有会怎么样,究竟有何作用,啊啊啊好烦啊!不想学了!!!
没事啦没事啦
![](https://i-blog.csdnimg.cn/blog_migrate/552c3b2f5c50b8a111b94245d3ca12b8.gif)
😎在这里你将会得到全面的解答👌
转义字符,字面意思也就是转变原来意义(思)的字符咯
不要慌😄转义字符都是有数的啦!
⬇诺诺诺
2.1转义字符的释义
转义字符 | 释义 |
\? | 在书写连续多个问号时,防止它们被解析成三字母词(额,不要慌,不懂对你学习也不影响) |
\' | 用于表示字符内部的单引号 |
\ " | 用于表示一个字符串内部的双引号。例如:" \" " |
\\ | 用于表示一个反斜杠,使得原本可能同后面字符或符号形成转义字符的反斜杠不转义 |
\a | 警告字符,代码运行至此会发出一声蜂鸣 |
\b | 退格符 |
\f | 进纸符 |
\n | 换行符,如打印函数中使用使用后在\n处即会转移至下一行继续打印 |
\r | 回车 |
\t | 水平制表符,相当于tab键,向后推进四个空格 |
\v | 垂直制表符 |
\ddd | ddd表示1—3个八进制的数字,并无限制。如:\130 代表的意思为X(ASCII码值,下讲) |
\xdd | dd表示1—2个十六进制的数字。如:\x30代表的意思为0(ASCII码值,下讲) |
并不需要都记住,知道大概有那些即可,能够看代码的时候不被误导
下面会针对上面容易出现的一些经典情况进行举例讲解,让你以后避坑!!!
2.2避坑经典案例!!
其实案例很多,但是通过以下可以透过表象看本质!!!火眼金睛有木有🐵
2.2.1 \'和\"
#include <stdio.h>
int main()
{
//我想打印一个单引号
printf("%c\n",''');//err(错) 因为只要两个单引号在一起就会凑成一对 最后一个就落了(双引号同理)
printf("%c\n",'\'');//true 因为这样中间的单引号就被转义,不会和前面一个单引号或者后面一个单引号凑对
return 0 ;
}
2.2.2 \t和\\
#include <stdio.h>
//现在打印我的学习文件地址 \text\text.c
int main ()
{
printf("\text\text.c"); // ext ext.c
printf("\\text\\text.c"); //\text\text.c
//原因在于 上者\t组成了水平制表符的转义字符,变成了按tab键的效果
// 下者\\首先组成了转义字符,阻止了\和t组成转义字符的可能,使得\只能是\ 哈哈哈哈是不是有点绕😆
return 0 ;
}
2.2.3 \ddd
#include <stdio.h>
判断该程序输出什么
int main ()
{
printf("c:\test\628\test.c"); //c: est28 est.c
printf("%d\n", strlen("abcdef")); //6
printf("%d\n", strlen("c:\test\628\test.c"));//14
//每一个转义字符都占一个位置,但字符串中\0占不了哈哈哈哈好可怜
return 0 ;
}
![](https://i-blog.csdnimg.cn/blog_migrate/e2abfcd81ad015ed5397cd48c093f44c.png)
3.ASCII码值对照表
![](https://i-blog.csdnimg.cn/blog_migrate/1f0c8dff91fa39be23c0de81eca6d8ae.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/e3619e96a776353f69466f57e1b8bb30.png)
好吧 博主又被耍了!!!😭😭😭