简单不先于复杂,而是在复杂之后。
目录
字符串
由双引号引起来的一串字符为字符串字面值,简称字符串。
char是字符类型,没有字符串类型。
但是字符串可以存储到字符数组中:
char arr[10] = "abcdef";
以上开辟了7个字符的空间
[ ]中可以不填,自动根据后面字符串内容开辟相应空间
字符串的结束标志是一个\0 转义字符,在计算字符串长度时 \0 只作结束标志,不作字符串内容
arr2 中字符只占用了空间的一部分,之后还有很多字符,\0 是字符串的结束标志,所以要在空间后直至遇到\0才终止。
strlen 是求字符串长度的一个库函数,string length,头文件string。
strlen是用来获取字符串的有效长度的,结尾标记'\0'不包含在内。
strlen获取的规则非常简单:从前往后依次检测,直到遇到'\0'是就终止检测。
字符数组不是一个有效的字符串,因为后面没有放置'\0',因此strlen在求解时,将有效字符检测完之后,还会继续向后检测,直到遇到'\0'是才终止,因此不确定之后的第一个'\0'在什么位置。
转义字符
转义字符 | 释义 |
\? | 在书写连续多个问号时使用,防止他们被解析成三字母词 |
\' | 用于表示字符常量 |
\“ | 用于表示一个字符串内部的双引号 |
\\ | 用于表示一个反斜杠,防止它被解释为一个转义序列符。 |
\a | 警告字符,蜂鸣 |
\b | 退格符 |
\f | 进纸符 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\ddd | ddd表示1~3个八进制的数字。 如: \130 X |
\xdd | dd表示2个十六进制数字。 如: \x30 0 |
\n
int main()
{
printf("abcn");
printf("abc\n")//换行符
return 0;
}
\0
int main()
{
printf("abc0def")//打印abcdef
printf("abc\0def")//打印abc
return 0;
}
\?
//三字母词
//??) - ]
//??( - [
int main()
{
printf("%s\n","(are you ok??)")
//打印结果(are you ok]
printf("%s\n","(are you ok\?\?)")
//打印结果(are you ok??)
//当前编译器不支持三字母词
return 0;
}
\'
int main()
{
printf("%c\n",''');//报错
printf("%c\n",'\'');//表示字符常量'
return 0;
}
\"
\"
int main()
{
printf("abcdef");//只有字符串能直接简化打印
printf("a");//字符串里可以只有一个字符
printf(""");//报错
printf("\"");表示一个字符串内部的双引号
return 0;
}
\\
int main()
{
printf("abcd\0ef");//打印结果abcd
printf("abcd\\0ef");//打印结果abcd\0ef
//表示一个反斜杠,防止它被解释为一个转义序列符。
printf("c:\test\test.c");//打印结果c: est est.c
printf("c:\\test\\test.c");//打印结果c:\test\test.c
//路径打印用\\
return 0;
}
\a
int main()
{
printf("\a\a\a\a\a\a\a");
//警告字符,蜂鸣
return 0;
}
\t
int main()
{
printf("abcd\tef");
//Tab = \t
return 0;
}
\ddd
int main()
{
printf("%c\n",'\130');//ddd表示1~3个八进制的数字
//打印结果X,为130这个八进制转化为十进制的数字作为ASCII码值所代表的字符
return 0;
}
字符\0 的 ASCII码值为0
字母大小写的 ASCII 码值相差32
\xdd
int main()
{
printf("%c\n",'\x60');
return 0;
}
下面是打印数据的格式
//%d - 打印整形
//%c - 打印字符
//%s - 打印字符串
//%f - 打印float类型的数据
//%lf - 打印double类型的数据
//%zu - 打印sizeof的返回值
注释
- 注释可以梳理思路
- 注释可以对复杂的代码解释