一、字符 和 ASCII编码
在键盘上可以敲出各种字符,如:a
,q
,@
,#
等,这些符号都被称为 字符。
语法:C语⾔中字符是用单引号括起来的,如:‘a’,‘b’,‘@’。
我们知道在 计算机中所有的数据 都是以 二进制 的形式存储的,那这些字符在内存中分别以什么样的⼆
进制存储的呢?
如果我们每个⼈自己给这些字符中的每个字符编⼀个⼆进制序列,这个叫做编码,为了方便⼤家相互通信,不造成混乱,后来美国国家标准学会(ANSI)出台了⼀个 标准 ASCII 编码 ,C语言中的字符就遵循了 ASCII 编码的方式。
二、ASCII码
我们不需要记住所有的ASCII码表中的数字,使⽤时查看就可以,不过我们最好能掌握⼏组特殊的数据:
★☆★
- 字符
A ~ Z
的 ASCII码值 从65 ~ 90
- 字符
a~z
的 ASCII码值 从97 ~ 122
- 对应的 大小写字符 (a和A)的ASCII码值的 差值 是 32
- 数字字符
0 ~ 9
的ASCII码值从48 ~ 57
- 换行
\n
的ASCII值是:10
- 在这些字符中ASCII码值从
0~31
这 32个字符 是不可打印字符,无法打印在屏幕上观察
单个字符的打印可以使⽤ %c
来指定格式 :
#include <stdio.h>
int main()
{
printf("%c\n", 'Q');
printf("%c\n", 81); //这⾥的 81 是 字符Q 的 ASCII码值 ,也是 可以正常打印 的
return 0;
}
可打印字符 展示 :
#include <stdio.h>
int main()
{
int i = 0;
for (i = 32; i <= 127; i++)
{
printf("%c ", i);
if (i % 16 == 15){
printf("\n");
}
return 0;
}
三、字符串和\0
C语⾔中如何表⽰字符串呢?使⽤双引号括起来的⼀串字符就被称为字符串,如:“abcdef”,就是⼀个字符串。
字符串的打印格式可以使⽤ %s
来指定,也可以直接打印如下:
#include <stdio.h>
int main()
{
printf(" %s \n", "hello C");
printf("hello c");
return 0;
}
C语⾔字符串中⼀个特殊的知识,就是在字符串的末尾隐藏放着⼀个 \0
字符,这个 \0
字符是字符串的结束标志 。
对于字符串"abcdef",我们实际上看到了6个字符:a,b,c,d,e,f,但是实际上在末尾还隐藏⼀个 \0
的转义字符,\0
是字符串的结束标志。所以我们在使用 库函数 printf() 打印字符串 或者 strlen() 计算字符串长度 的时候,遇到 \0
的时候就自动停止了。
C语⾔中也可以把⼀个字符串放在⼀个字符数组中,我们在这里利用下面的代码验证⼀下 \0
的功能。
#include <stdio.h>
int main()
{
char arr1[] = {'a', 'b', 'c'};//arr1数组中存放3个字符
char arr2[] = "abc"; //arr2数组中存放字符串
printf("%s\n", arr1);
printf("%s\n", arr2);
return 0;
}
调试观察 arr1 和arr2 的内容:
运行结果
结果分析:
我们可以看到, arr1 字符数组在打印的时候,打印了 a 、 b 、 c 后还打印了⼀些随机值,这就是因为 arr1 在末尾的地⽅没有 \0 字符作为结束标志,在打印的时候没有停⽌。
但是 arr2 的打印就是完全正常的,就是因为 arr2 数组是使⽤字符串常量初始化的,数组中有 \0
作为技术标志,打印可以正常停止。
★☆★ \0
字符串停止 作用
#include <stdio.h>
int main()
{
char arr1[] = {'a', 'b', 'c', '\0'};
char arr2[] = "abc";
printf(" %s \n", arr1);
printf(" %s \n", arr2);
printf(" %s \n", "abc\0def");
return 0;
}
四、转义字符
字符中有⼀组特殊的字符是转义字符。
转义字符顾名思义:转变原来的意思的字符。
⽐如:我们有字符 n
,在字符串中打印的时候⾃然能打印出这个字符,如下:
#include <stdio.h>
int main()
{
printf("abcndef");
return 0;
}
输出的结果:
如果我们修改⼀下代码,在 n
的前⾯加上 \
,变成如下代码:
#include <stdio.h>
int main()
{
printf("abc\ndef");
return 0;
}
输出的结果:
我们可以看到修改的前后代码输出的结果,截然不同的,那这是为什么呢?
这就是转义字符的问题, \n
是⼀个转义字符表示换行的意思,我们可以简单的理解为 \
让 n
的意思发生了转变, n
本来是⼀个普通的字符,被\
转义为换行的意思。
C语言中像这样的转义字符还有⼀些,具体如下:
\?
:在书写连续多个问号时使⽤,防⽌他们被解析成三字⺟词,在新的编译器上没法验证了。\'
:⽤于表⽰字符常量’\"
:⽤于表⽰⼀个字符串内部的双引号\\
:⽤于表⽰⼀个反斜杠,防止它被解释为⼀个转义序列符。\a
:警报,这会使得终端发出警报声或出现闪烁,或者两者同时发⽣。\b
:退格键,光标回退⼀个字符,但不删除字符。\f
:换⻚符,光标移到下⼀⻚。在现代系统上,这已经反映不出来了,⾏为改成类似于 \v 。\n
:换⾏符。\r
:回⻋符,光标移到同⼀⾏的开头\t
:制表符,光标移到下⼀个⽔平制表位,通常是下⼀个8的倍数。\v
:垂直分隔符,光标移到下⼀个垂直制表位,通常是下⼀⾏的同⼀列。
下⾯2种转义字符可以理解为:字符的8进制或者16进制表⽰形式\ddd
:d d d表⽰1~3个⼋进制的数字。 如: \130 表⽰字符X\xdd
:d d表⽰2个⼗六进制数字。 如: \x30 表⽰字符0
\0
:null 字符,代表没有内容, \0 就是 \ddd 这类转义字符的⼀种,⽤于字符串的结束标志,其ASCII码值是0.
代码演示:
#include <stdio.h>
int main()
{
printf("%c\n", '\'');
printf("%s\n", "\"");
printf("c:\\test\\code\\test.c\n");
printf("\a");
printf("%c\n", '\130'); //130是8进制,转换成10进制是88,以88作为ASCII码值的字符是
printf("%c\n", '\x30'); //x30中的30是16进制,转换成10进制是48,以48作为ASCII码值的
return 0;
}
这些ASCII码值是可以自己写代码验证的,⼤家也可以自己验证。
关于转义字符我们首先要了解,然后要能在字符串中识别出来。