字符串的基本概念
"hello,world!"
像这种由双引号引起来的一串字符称为字符串字面值,简称字符串。
'a' C语言中用单引号引起来的叫做字符
"a" 用双引号括起来的叫做字符串
注意:
- C语言是不提供字符串类型的 ,但是它有字符串。c++或者Java是提供字符串类型的。
- 字符串的结束标志是\0的转义字符。在计算字符串空间长度的时候,\0作为结束标志,不算作字符串内容。
例如:
这时候我们发现空字符串的空间长度为1,原因是系统默认\0作为字符串的结束标志,不算作字符串内容,此时字符串的空间长度为1。
论\0的重要性
我们用一段代码来解释说明
- 在数组arr1[ ]中,我们用字符串形式向数组中去添加内容,(系统默认存在\0)一般数组在编译器编译时会默认去开辟数组空间,这时也就开辟了\0的空间;
- 在数组arr2[ ]中,我们将5个字符依次放入arr2的数组中去,并没有去添加\0,当编译器把5个字符都输出后,在没有遇到\0的情况下,则将继续向后读取空间,直到遇到\0;
- 在数组arr3[ ]中,我们将\0也放入了arr3的数组中,在编译器将5个字符输出时,编译器遇到\0就停了下来。
转义字符
在C语言中,我们通常使用 \ 来表示转义。
首先,我们来看一小段代码:
在这里我们可以看到,第一个\未转义成功,而第二个\转义成功同时t也随之消失,这是为什么呢?
以下是常见的转义字符
转义字符 | 释义 |
---|---|
\? | 在书写连续多个问号时使用,防止他们被解析为三字母词 |
\’ | 用于表示字符常量‘ |
\" | 用于表示一个字符串内部的双引号 |
\\ | 用于表示一个反斜杠,防止它被解释为一个转义序列符 |
\a | 警告字符,蜂鸣 |
\b | 退格符 |
\f | 进制符 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\ddd | ddd表示1~3个八进制的数字 如 \130X |
\xdd | dd表示2个十六进制数字 如\x30 0 |
当我们试着求\n的大小时,就会发现\n在这里的空间长度为2
要特别注意:这里大小为2不是 \ 和 n各为1,而是\n和\0各为1。
因为在双引号里为字符串,而系统默认字符串的结束标志\0,也占有一个长度。
我们有时还会遇到这样一个情况:
这是因为strlen求出来的是字符串的内容长度,不包括\0,而sizeof所求出来的则是字符串的空间长度,包括\0。
最后我们来看一到面试题:求字符串的内容长度
#include<stdio.h>
int main()
{
printf("%d\n",strlen("abcdef"));//32被解析成一个转义字符
printf("%d\n",strlen("c:\test\328\test.c"));
return 0;
}
在这里\是用来转义的,第二行中\t代表一个内容长度,那么\32是我们的一个八进制数字,在转义的时候将作为一个内容长度。