user-0 提问: sizeof与strlen字符统计问题

回复:
user: user-0
content: 引用 14 楼 yajuie 的回复:[quote=引用 13 楼 yajuie的回复:]本人小白，也来自己推算一下。看看结果对不对？大神们就不要拍了啊！  char str1[]="\\0318\"asb"; char str2[]={'1','\0','2'}; char str3[]="1\02"; char a[]="a0\0a0\0"; printf("%d\n",sizeof(str1)); //sizeof()是计算数组大小，这个代码内，数组存放应该是这样 \,0,3,1,8,",a,s,b,\0;结果应为10;  printf("%d\n",strlen(str1)); //strlen()是计算字符串，但不会算\0，因此会是结果会是9  printf("%d\n",sizeof(str2)); //这个存放时是以字符形式存放的，后并没有0，因此它的结果应该是3.   printf("%d\n",sizeof("123")); //这段代码，我理解的不是很透说得不对的话，大神们可以指正一下，但不要光拍砖，不来干货，首先123是字符串，他会以字符串的形式存放在常量区，而这样交给sizeof()，这个字符串在常量区的首地址,所以说"123"加上\0,一共会有4个字符，这里会是,4  printf("%d\n",strlen(str2)); //这里就好理解了，strlen,遇到\0会给束，而字符数组内\0也就是第二个字符，就会结束，而且不计算\0，因此这里应该是1;  printf("%d\n",sizeof(str3)); //"1\02"; //数组的存放模式应该是，1,\0,2, \0因此这里是3  printf("%d\n",strlen(str3));// "1\02"; //这里因为第二个字符是 \0，这里应该输出1  printf("%d\n",sizeof(a));// "a0\0a0\0"; //字符串在内存中的存放 a,0,\0,a,0,\0,\0,应此这里应输出 7  printf("%d\n",strlen(a));// "a0\0a0\0"; //第3个元素是\0，应此这里是2; 居然在这种情况下还错了两个地方，而且有一道，还数数数错了。晕死[/quote]  哈哈，感谢你这么耐心的解答，我明白了。谢谢

user: user-0
content: 引用 1 楼 fly_dragon_fly 的回复:sizeof是求的类型, strlen是求字符串长度 1 有两个\\, 就算一个\0也要小心, 后面跟数字默认是八进制 2 str2是数组, "123"类型是const char * 3 第二个字节就是0 4 数组 5 \0后跟数字代表八进制 6 数组 引用 7 楼 user-7 的回复:如果希望表达 abd\0 和 2xyz 连接而成的字符串 写成 "abcd\0""2xyz" 这样两个 中间的引号会被忽略，因为两个字符串字面值，连续写（中间有空格）代表他们的连接    输出的时候是 abcd  继续输出可以输出2xyz 谢谢回答啊，明白是怎么回事了。

user: user-1
content: 引用 1 楼 fly_dragon_fly 的回复:sizeof是求的类型, strlen是求字符串长度 1 有两个\\, 就算一个\0也要小心, 后面跟数字默认是八进制 2 str2是数组, "123"类型是const char * 3 第二个字节就是0 4 数组 5 \0后跟数字代表八进制 6 数组"123" 类型是char[4] 不是char*

user: user-2
content: 了解一下 sizeof是编译期计算的，其源代码在编译器的源代码中； strlen是运行期计算的，其源代码在C运行时库的源代码中。

user: user-3
content: sizeof是求的类型, strlen是求字符串长度 1 有两个\\, 就算一个\0也要小心, 后面跟数字默认是八进制 2 str2是数组, "123"类型是const char * 3 第二个字节就是0 4 数组 5 \0后跟数字代表八进制 6 数组

user: user-4
content: 引用 13 楼 yajuie的回复:本人小白，也来自己推算一下。看看结果对不对？大神们就不要拍了啊！  char str1[]="\\0318\"asb"; char str2[]={'1','\0','2'}; char str3[]="1\02"; char a[]="a0\0a0\0"; printf("%d\n",sizeof(str1)); //sizeof()是计算数组大小，这个代码内，数组存放应该是这样 \,0,3,1,8,",a,s,b,\0;结果应为10;  printf("%d\n",strlen(str1)); //strlen()是计算字符串，但不会算\0，因此会是结果会是9  printf("%d\n",sizeof(str2)); //这个存放时是以字符形式存放的，后并没有0，因此它的结果应该是3.   printf("%d\n",sizeof("123")); //这段代码，我理解的不是很透说得不对的话，大神们可以指正一下，但不要光拍砖，不来干货，首先123是字符串，他会以字符串的形式存放在常量区，而这样交给sizeof()，这个字符串在常量区的首地址,所以说"123"加上\0,一共会有4个字符，这里会是,4  printf("%d\n",strlen(str2)); //这里就好理解了，strlen,遇到\0会给束，而字符数组内\0也就是第二个字符，就会结束，而且不计算\0，因此这里应该是1;  printf("%d\n",sizeof(str3)); //"1\02"; //数组的存放模式应该是，1,\0,2, \0因此这里是3  printf("%d\n",strlen(str3));// "1\02"; //这里因为第二个字符是 \0，这里应该输出1  printf("%d\n",sizeof(a));// "a0\0a0\0"; //字符串在内存中的存放 a,0,\0,a,0,\0,\0,应此这里应输出 7  printf("%d\n",strlen(a));// "a0\0a0\0"; //第3个元素是\0，应此这里是2; 居然在这种情况下还错了两个地方，而且有一道，还数数数错了。晕死

user: user-4
content: 本人小白，也来自己推算一下。看看结果对不对？大神们就不要拍了啊！  char str1[]="\\0318\"asb"; char str2[]={'1','\0','2'}; char str3[]="1\02"; char a[]="a0\0a0\0"; printf("%d\n",sizeof(str1)); //sizeof()是计算数组大小，这个代码内，数组存放应该是这样 \,0,3,1,8,",a,s,b,\0;结果应为10;  printf("%d\n",strlen(str1)); //strlen()是计算字符串，但不会算\0，因此会是结果会是9  printf("%d\n",sizeof(str2)); //这个存放时是以字符形式存放的，后并没有0，因此它的结果应该是3.   printf("%d\n",sizeof("123")); //这段代码，我理解的不是很透说得不对的话，大神们可以指正一下，但不要光拍砖，不来干货，首先123是字符串，他会以字符串的形式存放在常量区，而这样交给sizeof()，这个字符串在常量区的首地址,所以说"123"加上\0,一共会有4个字符，这里会是,4  printf("%d\n",strlen(str2)); //这里就好理解了，strlen,遇到\0会给束，而字符数组内\0也就是第二个字符，就会结束，而且不计算\0，因此这里应该是1;  printf("%d\n",sizeof(str3)); //"1\02"; //数组的存放模式应该是，1,\0,2, \0因此这里是3  printf("%d\n",strlen(str3));// "1\02"; //这里因为第二个字符是 \0，这里应该输出1  printf("%d\n",sizeof(a));// "a0\0a0\0"; //字符串在内存中的存放 a,0,\0,a,0,\0,\0,应此这里应输出 7  printf("%d\n",strlen(a));// "a0\0a0\0"; //第3个元素是\0，应此这里是2;

user: user-5
content: 引用 9 楼 zhao4zhong1 的回复:我说过所有sizeof都是在编译期计算了吗？  你以为朕是外国人不懂中国话吗？!

user: user-6
content: 好吧, 这里是C语言子版块, 我还以为是C++, C99支持VLA, 虽说C11时半废了

user: user-6
content: 引用 8 楼 sholber 的回复:[quote=引用 2 楼 zhao4zhong1 的回复:] 了解一下 sizeof是编译期计算的，其源代码在编译器的源代码中； strlen是运行期计算的，其源代码在C运行时库的源代码中。  麻烦告诉我，下面的sizeof如何在编译期算出来：  int f (int n) {     return sizeof (int [n]); }[/quote]  sizeof表达式操作的是常量, 这样会编译失败

user: user-2
content: 我说过所有sizeof都是在编译期计算了吗？

user: user-7
content: 如果希望表达 abd\0 和 2xyz 连接而成的字符串 写成 "abcd\0""2xyz" 这样两个 中间的引号会被忽略，因为两个字符串字面值，连续写（中间有空格）代表他们的连接    输出的时候是 abcd  继续输出可以输出2xyz

user: user-2
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！

user: user-5
content: 引用 2 楼 zhao4zhong1 的回复:了解一下 sizeof是编译期计算的，其源代码在编译器的源代码中； strlen是运行期计算的，其源代码在C运行时库的源代码中。  麻烦告诉我，下面的sizeof如何在编译期算出来：  int f (int n) {     return sizeof (int [n]); }

user: user-2
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-7
content: \\ 表示 \ 本身  所以 字符串是 【\ ,0 ,3,1,8,",a,s,b】 这9个字符 \0 是一个字符。 值为 0 因为已经 转义了一次了 这个 \ 不再能够转义别的字符了。 \02，是8进制转义字符 \02 =2 , 转义字符 遇到数字要特别注意，，，遇到字母，有时候也要仔细考察 \a，\b 也都是转义字符