在定义了数组大小时:
sizeof是运算符,表示编译时分配的空间大小,即数组定义的大小,char t[20] = "sfa"。sizeof: 20; strlen: 3.
在未定义数组大小时:
sizeof根据实际位数确定,注意字符串隐藏的\0也算一位,。
eg:1
char s[] = "a\128\\\tcb\xdg\n";
sizeof计算s大小时,为11位:a \12 8 \\ \t c b \xd g \n \0
strlen计算s大小时,为10位:strlen计算字符串长度时遇\0结束,但大小计算不包括\0
eg:2
char a[] = "a0\0a0\0";
sizeof(a)大小为7,即:a 0 \0 a 0 \0 \0
strlen(a)大小为2
char s[] = "a\128\\\tcb\xdg\n"; 打印字符数组s:转义字符:
\yyy : 1~3位八进制数所代表的任意字符,其中y的范围是0~7
\xyy : 1~2位十六进制所代表的任意字符,其中y的范围是0~F
for (int i = 0; i < sizeof(s); i++)
{
printf("%c", s[i]);
}
eclipse输出: (换行 \n 和 回车\r 效果都是换行的效果)
a8\ cb
g
gcc编译器输出:
a
g\ cb //回车后光标移到第二行起始,g将8覆盖
\12 : 2位八进制数,十进制10,控制字符LF,表示换行,gcc编译器下,表示从当前位置换到该位置对应的下一行
\\ :表示 \
\t : 表示水平制表,即一个TAB
\xd: 1位十六进制数,十进制13,控制字符CR,表示回车(gcc编译器下,回车表示回到本行首位,其后输出字符会覆盖之前数据)
注意转译字符 八进制和十六进制的问题:
char s[] = "a\12345b\x1221g\xay";
八进制最多选3位,即\123,当该八进制数转化为十进制后大于ASCII码表最大值127时,是一个乱码。
十六进制最多选两位,但截取\x后的整数的最后2位处理,前面的位数丢弃,即截断,即丢弃12,十六进制\x21,十进制33表示!
所以长度计算中:
sizeof是10位,即:a \123 4 5 b \x21 g \xa y \0
strlen是9位,即:a \123 4 5 b \x21 g \xa y
常用转译字符:
\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----空字符(NULL)----000
\yyy----1~3位八进制数所代表的一个任意字符----三位八进制
\xyy----1~2位十六进制所代表的一个任意字符----二位十六进制