'\0' 是字符串的句号
写下 char s[6] = "abc12",内存里是 6 个格子:5 个真字符,外加编译器自动补上的 '\0'(编码就是整数 0)。所以装 5 个字符至少开 6 格,做题直接开大如 char s[100]。
printf 的 %s 打印到 '\0' 就停,strlen 数到 '\0' 就停——如果数组里没有 '\0',这些函数会越过末尾一直读垃圾内存。
strlen 和 sizeof 数的不是一回事
同一个 char s[6] = "abc12":strlen(s) = 5,是从头逐格数到 '\0' 为止的真字符数('\0' 不计入);sizeof(s) = 6,量的是整个数组占几个字节,和里面装了什么无关。要字符串长度,一律用 strlen,记得 #include <string.h>。
strcmp 判等、strcpy 拷贝
判断字符串相等只能写 strcmp(a, b) == 0,不能用 ==——a、b 是数组首地址,== 比的是地址不是内容。strcmp 从头逐字符比,第一处不同就定胜负,返回负数表示前者字典序在前。
strcpy(dst, src) 会把 '\0' 也一起拷过来,且不检查大小:目标数组必须至少开 strlen(src) + 1 格,开小了就写穿邻居内存。读入不含空格的单词用 scanf("%s", s),数组名本身就是地址,s 前不写 &。