记录字符串初始化、I/O操作
初始化
char str[] = "abc";
char str[] = {'a','b','c'}; // 末尾没有\0, 打印会出现乱码
char str[10] = {'a','b','c'}; // 初始化长度小于数组长度时, 会自动添加 \0
char *p = "abc";
读写
数组读写直接通过下标操作,指针读写需要注意:%s接受地址,%c接受值(需要*p或p[i])
char* p = "abc";
printf("%s\n", p); // abc
prinft("%s\n", *p); // a?????找不到结束符,会一直打印
printf("%s\n", p[0]); // 同上
printf("%c\n", *p); // a
printf("%c\n", p[0]); // a
注意: 数组变量是一个特殊的指针,不能修改它的指向;如果被使用的数组会改变指向,可以用指针类型
。
char cs[] = "abc";
cs = "bcd"; // err: 表达式必须是一个可以修改的左值
// 说明cs已经被修饰为 char const* cs
为什么要把数组设计为常量指针?
解释1:确保函数执行完成后编译器好释放空间,如果数组地址可以改变但长度没有改变,最终导致释放的内存区域不正确(为什么不做一份首地址拷贝?,原谅我天马行空的想法)。
字符串拷贝
/**
* 字符串拷贝
* @param to 保存拷贝结果
* @param from 拷贝源
* @return len 拷贝成功返回有效字符个数, 否则返回0
*/
int str_cpy(char * to, char * from) {
int len = 0;
while (to && from && ('\0' != ( *to ++ = *from ++))) // 如果遇到 '\0' 先拷贝再校验,
len++;
return len - 1;
}