1 字符串
"abcdef"
这种由双引号引起来的一串字符,称为字符串字面值,或者简称字符串。- 字符串就是字符数组,好多个字符串起来的一组数据。
int main()
{
char c = 'c';//定义了一个字符数据类型c
"abcdef" ;// 这种由双引号引起来的一串字符称为字符串字面值,或者简称字符串。
return 0;
}
注: c语言中有字符类型没有字符串类型,若想存储需要放入字符数组中。
如下:
int main()
{
char arr[] = "abcdef"; // 存储字符串
return 0;
}
既然字符串存储在字符数组中,那么数组中存储了哪些东西呢?
- 在VS中按F10对代码进行调试,页面左端会显示黄色的小三角(如下图所示),三角号到哪行代码即运行到哪行,按一次F10 运行一行,直到运行到最后一行。
- 调试后,点击
调试->窗口->监视->监视(1)
- 输入监视的对象,此文中为
arr
, 并展开。
我们发现数组arr
大小为7并不是6,除了所要存储的 abcdef
外还另外放入了 \0
,说明还默认存储了一个 \0
,这个 \0
即为字符串的结束标志。
\0
作为字符串的结束标志非常重要
为什么重要呢?
思考以下代码输出结果:
#include <stdio.h>
int main()
{
char arr1[] = "abcdef";
char arr2[] = { 'a','b','c','d','e','f' };
char arr3[] = { 'a','b','c','d','e','f','\0'};
printf("%s\n", arr1); // %s 为输出字符串
printf("%s\n", arr2);
printf("%s\n", arr3);
return 0;
}
输出结果:
abcdef
abcdef烫烫烫烫烫abcdef
abcdef
解释:
- 首先查看一下 arr1 和 arr2 存储的内容
arr1用字符串初始化,编译系统会自动加入 \0
,所以arr1中有 \0
; 当我们主动给arr2中放入 abcdef
,数组中并没有 \0
。
- 当我们用
%s
输出字符串时,输出结果为:
字符串作为一维数组存放在内存中,当程序遇到 \0
时判断字符串结束,如果没遇到,编译器自动向后打印直到遇见 \0
结束 。
对于arr1
数组 arr1 从 a
开始输出,遇到 \0
结束,arr1是以字符串初始化,所以编译系统会默认加入 \0
。
在计算字符串长度的时候 \0
是结束标志,不算作字符串内容,不打印。所以arr1打印结果为 abcdef
对于arr2
当我们主动给arr2中放入 abcdef
,编译系统并不会自动加入 \0
。
数组arr2也是从 a
开始打印,但是不同的是 arr2 中并没有 \0
,而且arr2后面还有内存,内存中存储了其他内容,所以程序继续往后打印,直到遇到了一个 \0
结束打印,这就是为什么arr2会打印我们指定外的内容。
对于arr3
arr3中主动添加 \0
和arr1效果相同。
总结:
- c语言中没有字符串类型,若想存储需要放入字符数组中。
- 字符串的结束标志是一个 \0的转义字符。在计算字符串长度的时候 \0是结束标志,不算作字符串内容。
2 转义字符
2.1 概念
C中定义了一些字母前加""来表示常见的那些不能显示的ASCII字符,如\0,\t,\n等,就称为转义字符。
转义字符 | 释义 |
---|---|
\? | 在书写连续多个问号时使用,防止他们被解析成三字母词 |
\` | 用于表示字符常量` |
\" | 用于表示一个字符产内部的双引号 |
\\ | 用于表示一个反斜杠,防止它被解释为一个转义序列符 |
\a | 警告字符,蜂鸣 |
\b | 退格符 |
\f | 进纸符 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\ddd | ddd表示1~3个八进制的数字。如:\130 |
\xdd | dd表示2个十六进制数字。如:\x30 |
2.2 详解
2.2.1 \?
早期编译器会把三字母词 ??)
解析成 ]
;把三字母词 ??(
解析成 [
。若不想这样解析,在问号前面加上 \
,此时的 ?
不再是三字母词里的问号。目前编译器不在支持三字母词。
2.2.2 \'
当想打印字符 '
时,按如下编写会报错。
因为编译器把前两个单引号看成了一对,认为前两个单引号中间括了一个字符,最后一个单引号落单了,编译器无法解析。
在中间单引号前加 \
转义即可,让它单纯的就是一个单引号。
int main()
{
printf("%c\n", '\'');
return 0;
}
2.2.3 \"
当想打印字符 "
时,用 \"
,与 \'
道理相同。
int main()
{
printf("%s\n", "\"");
return 0;
}
2.2.4 \\
将 \
转义成单纯的斜杠。
当打印字符串 abcd\0ef
时只会输出 abcd
,因为遇到了字符串的结束标志\0,此时在 \
前在加一个 \
,把斜杠转移成普通的斜杠,不让\0
组成转义字符。
int main()
{
printf("abcd\\0ef");
return 0;
}
// 结果
// abcd\0ef
2.2.5 \n
和\r
\n : 对输出进行换行
\r : 对输出进行回车
2.2.6 \t
和电脑的Tab键效果相同。
2.2.7 \ddd
ddd表示1~3个八进制的数字。如:\130。130为八进制的数字(幺叄零),不是一百三。
当打印 \130 时打印出来的是大写的X
因为 \ddd 表示的是8进制的ddd转换成10进制的数字,即8进制的130,转换成10进制的88, 而88在ASCII码上对应的即为大写的X,所以打印字符88,即打印88在ASCII码上对应的值X。
2.2.8 \xdd
dd表示2个十六进制数字。如:\x60 。\x60
是将60这个十六进制的数字转换成十进制的96。然后打印出96对应的ASCII码的值。
总结:
只需知道 \?
\'
\"
\\
\n
\r
\t
\ddd
\xdd
即可。
3 注释
注释是对代码的解释和说明文字。
C语言中的注释分为两种:
3.1 C++风格的注释
// 这是单行注释文字
3.2 C语言风格的注释
/*
这是多行注释文字
这是多行注释文字
这是多行注释文字
*/
3.3 使用的技巧
如果我们要对代码进行解释,那么就可以使用注释。
当注释的内容比较少,一行就写完了,可以用C++风格的注释。
如果注释的内容比较多,需要写在多行,那么可以使用C风格的注释。
3.4 注意
注释的内容不会参与编译和运行的,仅仅是对代码的解释说明而已。
所以,不管在注释当中写什么内容,都不会影响代码运行的结果。
C语言风格的注释不能嵌套注释
C++风格的注释可以注释一行也可以注释多行