10.1 基本概念
1 字符串字面量 “hello, world”
char str[] = "hello, world";
2 不要将字符常量和字符串常量混淆
易混淆的 'a' 和 "a" (由两个字符’a’和’\0’组成的)
char c = 'a';
char c = "a";
"abc" 字符串本身是一个常量,它的类型是字符指针类型 const char *
const char * p = "abc";
3 转义用法
\123 八进制表示
\x18 十六进制表示
\ 连接作用 (推荐使用 "hello" "world")
10.2 字符串的存储
易混淆的知识点 ‘\0’ vs ‘0’ 0x00 vs 0x30 (ASCII 码值不一样)
'0' vs "0"
0x30 vs 0x30 0x00 (字节数不一样)
'\0' vs 0
0x00 vs 0x00 00 00 00 (字节数不一样)
'\0' vs '\x0'
0*8 vs 0*16 (权重不一样,字节数一样)
经典题目
#define CHAR(hex) "0123456789ABCDEF"[hex]
printf('\n'); 为什么会出现段错误? 请结合指针传参解释一下。
10.3 初始化字符串数组
几种方法比较
char buf[8] = "012"; // ok, the left is = '\0'
char buf[8] = "0123456"; // ok, is a string
char buf[8] = "01234567"; // ok,not a string
char buf[8] = "012345678"; // ok,not a string, warning
char buf[] = "0123456789"; // good, size is 11
易混淆的错误
char buf1[] = "hello";
char * buf2 = "HELLO";
不同点1 - 类型不同:buf1是数组 vs buf2是指针
不同点2 - 大小不同:buf1占6字节 vs buf2占4字节
不同点3 - 用法不同:buf1不能++ vs buf2可以++
不同点4 - 属性不同:buf1是地址常量 vs buf2是指针变量
不同点5 - 存储不同: "hello"是数据段(全局) vs "HELLO"是常量数据段
不同点6 - 赋值不同:字符串拷贝赋值(局部) vs 常量字符串的地址赋值
不同点7 - 写权限不同: buf1[0]='H' 修改可以 vs buf2[0]='h'修改错误
不同点8 - 效率不同: 全局buf1 > 局部buf2(常用) > 局部buf1
10.4 字符串的读写
printf("%s\n", p); -> printf("%.5s\n", p);
puts(p)
scanf("%s", p); -> scanf("%5s", p);
gets(p); -> fgets