c语言问题

为什么结果是52436
#include <string.h>
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
char a[5];
a[0]='a';
a[1]='c';
a[2]='\0';
a[3]='a';
a[4]='b';
printf("%d\n",sizeof(a));
printf("%d\n",strlen(a));
printf("%d\n",sizeof("abc"));
printf("%d\n",strlen("abc\0d"));
printf("%d\n",sizeof("abc\0d"));
return 0;
}

简单讲一下strlen和sizeof的原理你就明白了
strlen的值是字符串结束符前的字符个数,即‘\0'前的字符个数(有a和c两个)
sizeof直接读取占用的空间字符个数,例如字符串“abc”占用4个字节,(abc\0)追问

如果这样说,上面的程序更本就不是那样子的,那都是我直接拿到vc上弄了的,都对着呢,可是你说的解释不通啊。

追答

char a[5];
a[0]='a';
a[1]='c';
a[2]='\0';
a[3]='a';
a[4]='b';
printf("%d\n",sizeof(a)); //a数组定义的大小为5,所以这个值为5
printf("%d\n",strlen(a)); //只输出\0前的字符个数,即a[0]a[1]两个,值为2
printf("%d\n",sizeof("abc")); //abc储存表示为abc\0,由于是sizeof,不管\0只看占用空间,4字节
printf("%d\n",strlen("abc\0d"));//strlen读取\0前的字符个数abc3个,值为3
printf("%d\n",sizeof("abc\0d"));//储存表示为'a''b''c''\0''d''\0',共6个,值为6

注意:每个带双引号的字符串后都有一个字符串结束符\0,’c‘占用一字节,而“c”占用两字节(c和\0)

解释完全成立!

追问

再问下,那这个为什么是7呢。
void main()
{printf("%d",sizeof("china\0"));}为什么这个又是7呢

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-10-28

sizeof指内存大小,以字节为单位。

strlen是字符串长度,数到字符串以\0结尾。

字符串末尾自动添加\0表示结束。

第2个回答  2011-10-28
你的程序无非就是表达这样一个意思:strlen 和 sizeof 的区别 。记住两点,strlen是测试字符串的长度,也就是字符串所含有的字符个数,不包括隐含的\0,比如 “abc” strlen得到的长度就是3. 而sizeof是测试字符串所含的空间大小,包括隐含的\0。例如同样的“abc”,在VC6中,得到的大小为4,即4个字节。 所以一般情况下,可以认为sizeof(str) = strlen(str)+1.追问

如果这样说,上面的程序更本就不是那样子的,那都是我直接拿到vc上弄了的,都对着呢,可是你说的解释不通啊。

追答

你如果直接sizeof(“abc\0d”)这样的话,就会认为有a,b,c,\,0,d这6个字符,一个字符占一个字节。你考虑考虑吧。\0在这里面是分开的,不是代表字符串的结束符。

第3个回答  2011-10-28
s追问

什么啊。
void main()
{printf("%d",sizeof("china\0"));}为什么这个又是7呢

追答

告诉我这是干什么的

追问

我提问问题你不是回答了么,我就问一下,看你知道不知道。