字符串
字符串就是一串字符
用英文双引号括起来的字符
int main() { "dasgfhjkasg\n" "hello world!" return 0; }
字符串的结束标志是\0这个转义字符
如何证明呢?
int main() { //字符数组 - 数组是一组相同类型的元素 char arr[] = "hello";//方括号内不写数组长度时,会根据后面元素来初始化 return 0; }
运行时查看调试监视arr中可以看到
数组的第六位存放'\0'
所以\0是字符串结束的标志,字符串结尾都隐藏了一个\0
结束标志如何理解
#include<stdio.h> int main() { char arr1[]="abc"; char arr2[] = {'a','b','c'}; printf("%s\n", arr1); printf("%s\n", arr2); return 0; }
运行监视
//arr1 中有四个元素 - 多一个 \0 //arr2 中有三个元素
运行结果
abc abc烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫贴-␦→
我们来看空间内容
数组名称 | 内存块 |
---|---|
arr1 | abc\0 |
arr2 | abc |
arr2打印完成后后面空间是未知的,没有停止符号,所以会继续打印乱码
测试放入\0
int main() { char arr1[]="abc"; char arr2[] = {'a','b','c','\0'}; printf("%s\n", arr1); printf("%s\n", arr2); return 0; }
结果
abc abc
再次验证一下
求字符串长度
strlen(); //求字符串的长度 string length
int len = strlen("abc"); printf("%d",len);
输出结果
3
出现警告strlen未定义 - 出现原因,没有引用头文件
需要引用
#include <string.h>
字符串的结束标志\0仅仅是结束标志!!!
当我们求长度时并不计算在内!!!
#include<stdio.h> #include <string.h> int main() { char arr1[] = "abc"; char arr2[] = { 'a','b','c' }; printf("%d\n", strlen(arr1)); printf("%d\n", strlen(arr2)); return 0; }
运行结果
3 42//随机值,直到找到\0才会停下
意料之中,因为没有终止符,所以字符串长度为随机值
#include<stdio.h> #include <string.h> int main() { char arr1[] = "abc"; char arr2[] = { 'a','b','c','\0'}; printf("%d\n", strlen(arr1)); printf("%d\n", strlen(arr2)); return 0; }
运行结果
3 3
完美!
转义字符
#include<stdio.h> int main() { printf("C:\test\test.c"); return 0; }
打印结果
C: est est.c
转义字符:转变了原来的意思
三字母词已经不支持 — 比如 ??) 会变成 ]
例如
int main() { printf("%c",'''); return 0; }
报错是因为单引号,所以我们需要转义一下
int main() { printf("%c",'\''); return 0; }
输出结果
'
printf在打印数据的时候可以指定打印的格式
printf("%d",100); printf("%c",'a'); printf("%s","abc");
如何不让斜杠被认为是转义字符
\t会被转义成水平制表符,我们可以用斜杠转义斜杠来解决上面的问题
#include<stdio.h> int main() { printf("C:\\test\\test.c"); return 0; }
打印结果
C:\test\test.c
成功!
\转义字符 意义 ASCII码值(十进制) \a 响铃(BEL) 007 \b 退格(BS) ,将当前位置移到前一列 008 \f 换页(FF),将当前位置移到下页开头 012 \n 换行(LF) ,将当前位置移到下一行开头 010 \r 回车(CR) ,将当前位置移到本行开头 013 \t 水平制表(HT) (跳到下一个TAB位置) 009 \v 垂直制表(VT) 011 \ 代表一个反斜线字符’’’ 092 ’ 代表一个单引号(撇号)字符 039 " 代表一个双引号字符 034 ? 代表一个问号 063 \0 空字符(NUL) 000 \ddd 1到3位八进制数所代表的任意字符 三位八进制 \xhh 十六进制所代表的任意字符 十六进制
\ddd 1到3位八进制数所代表的任意字符 三位八进制
int main() { printf("%c\n",'\130'); return 0; }
输出结果
X //——ASCII码值为88
八进制130转化为十进制为88
键盘上可以打出各种字符
各种字符是如何存储的
A — 65
B — 66
a — 97
ASCII码表:每一个字符都有一个值:ASCII值
\xhh 十六进制所代表的任意字符 十六进制
int main() { printf("%c\n",'\X30'); return 0; }
输出结果
0 //’0‘的ASCI码值为48,十六进制为30
面试题
#include<stdio.h> int main() { //问题1:在屏幕上打一个单引号,怎么做 //问题2:在屏幕上打一个字符串,字符串的内容是一个双引号”,怎么做 printf("%c\n", '\‘'); printf("%s\n", "\""); return 0; }
这道题不难,根据上面的内容可以直接给出答案
笔试题:
//程序输出什么? #include<stdio.h> int main() { printf("%d\n",strlen("abcedf")); printf("%d\n",strlen("C:\test\328\test.c")); return 0; }
答案为
14//转义字符算一个字符
魔鬼细节
/328
我们很容易想到上面的 — \ddd 1到3位八进制数所代表的任意字符 三位八进制
但是八进制数怎么能出现8呢朋友
注释
用来解释复杂代码
//这种注释风格是C++注释风格 /* 这种注释风格是C语言的注释风格 */ //这种最为常用,C语言注释不支持嵌套注释,所以C++风格更常用