当前位置:编程学习 > VC++ >>

一道VC++的题目

有个程序,部分代码如下 class String{ char *Buffer; public: String(char *s) { if(s){ Buffer=(char *)new char[strlen(s)+1] strcpy(Buffer,s); } 这是关于构造函数的,请问为何 Buffer=(char *)new char[strlen(s)+1]不写成 Buffer=(char *)new char[strlen(s)],为何要加1
答案:那个1个字节是用来存放'\0'的,因为strcpy这个函数将s拷贝到Buffer的时候,是不会给Buffer的最后增加结束符'\0'的。strlen这个函数获得的是这个字符串的真实长度,不包括最后的结束符'\0'的。
例如:
一句代码String str("abc");
执行构造函数时,strlen("abc")的值为3,但是我们在内存中保存字符串“abc”的时候是需要4个字节的,多的一个字节需要用来放“\0‘;当执行代码strcpy(Buffer,s);时实际上只复制了3个字符”abc“,’\0‘用于表示字符串的结束。
当我们执行new后,开辟的空间中每个字节都默认存放的是0,也就是'\0'。
当我们使用str.Buffer时,最后的结束符能确保系统定位字符串str.Buffer的长度,如果没有结束符的话,系统会一直读取直到遇到第一个结束符,这样得到的可能就不是我们想要的字符串”abc“而可能是”abcry8uut8oyo89“。
其他:必须要加1呀,因为字符串是以'\0‘结尾的呀,但是这个结尾表示符却并不算在strlen函数所返回的数值之中。

上一个:在VC中动态创建Button控件
下一个:一道VC++题目,求详细的解释

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,