读书人

为何答案是7不是1

发布时间: 2013-09-05 16:02:06 作者: rapoo

为什么答案是7,不是1?
#include<iostream>
#include<cstring>
using namespace std;

int main()
{
char a[]={'b'};
cout<<strlen(a)<<endl;
}

[解决办法]

字符串数组的'\0'忘了吧!
可以这样写char a[]={'b', '\0'};

[解决办法]
strlen() 是根据\0判断结尾
char a[] = {'b'}; //没有\0结尾
所以出现大于1的任何结果都是不奇怪的。
[解决办法]
引用:
那也就是说结果可以是大于1的任意值了?

是的,strlen函数内部不碰到0会一直找下去,直到找到1个\0
在内存中啥时候碰到0不确定。
[解决办法]
这得看内存里的内容了,a只有遇到'\0'才结束,
你可以DEBUG一下,具体看一下内存里的内容

[解决办法]

sizeof(a);//

[解决办法]
引用:
我是故意不写'\0'的,想测试一下程序的结果。
不明白为什么它的结果是7,而不是1?


结果是个随机值,这得看a[0]的后面在什么位置上出现0值的单元
[解决办法]
楼主,你写的那个strlen(a),最后求得是a所表示的那个地址的长度,而不是a这个数组的长度
[解决办法]
引用:
楼主,你写的那个strlen(a),最后求得是a所表示的那个地址的长度,而不是a这个数组的长度

楼主,不好意思,我搞错了
[解决办法]
没有结束符,内存是随鸡的....
[解决办法]
因为字符串数组没有写\0结束符, 而strlen又需要\0结束符来计算长度, 所以它会以a数组内存为起点, 一直往后在连续的内存中找, 它是不管越界问题的, 直到找到一个\0,才认为这个串结束了, 然后返回长度.
所以你这样, 具体会输入几, 完全是看当时你的内存中的数据是怎么样的.
[解决办法]
strlen函数问题,直到找到‘\0’
[解决办法]
引用:
我擦,结果应该是8把~~~

跟编译器相关,更准确的说是跟前面某个使用该内存地址的函数有关,这个值等编译完成了,运行结果基本就固定了
[解决办法]
char a[2]={'b'};

这样 结果就是1了。
[解决办法]
这样没有字符串结束符号,所以它会随机的遇到‘\0’结束,所以下面输出数据长度的值是随机的
[解决办法]
strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值。
[解决办法]
引用:
strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值。


+1
[解决办法]
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……

对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。

[解决办法]
char a[]={'b'};
单引号变成双引号。
[解决办法]
也有可能是1,2,3,4,5,6,7,8,9,10,J,Q,K,小王,大王。。。。。。。字符串的末尾要有'\0'
[解决办法]
引用:
Quote: 引用:

strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值。


+1

就这个意思,顶一个

读书人网 >C++

热点推荐