读书人

请教字符串变量末尾有\0么

发布时间: 2012-05-15 14:35:29 作者: rapoo

请问字符串变量末尾有\0么?
string str1="China",str2="Canada";
str1=str2;

如上,书上说str1开始长度为5,后再次赋值后为6,难道不应该先6后7么?要不然C++怎么知道输出到何时结束?

string name[5]={"zhao","qian","sun","li","zhou"};

name是个字符串数组,书上说字符串数组中的每个元素的值只包含字符串本身的字符而不包括'\0'
这句话对么?

[解决办法]
字符串末尾的'\0'不算在字符串的长度内。
[解决办法]
'\0'是字符串结束的标志。字符串的长度是指有效长度,不包括结束标志。
[解决办法]
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

[解决办法]
不要混淆了c中的字符串类型和C++中的字符串类型

在c中,对于字符串,仅仅一个指向char的指针就足够了,从这个位置开始扫描,一旦遇到\0,就可认为字符串结束了。字符串长度可用函数strlen来求得。

在c++中,定义了新的类string,string是标准模板库basic_string的一个实例化,类string包含了3个成员变量_Bx,_MySize,_Myres,其中,_Bx又包括了成员_Buf,他指向的就是字符串的地址。_MySize存储了字符串的长度。string成员函数length可返回字符串的长度,从下面的代码可知,他直接返回_Mysize.下面给出string和其成员函数length的定义. 所以,从这个意义上讲。存储字符串的缓冲区所需要的空间是可以等于实际长度的,如果不需要将Buf转换为c中的字符串指针,是不需要一个额外的\0的。

typedef basic_string<char, char_traits<char>, allocator<char>> string;

_Bx
_Buf
_Ptr
_Yysize;
_Myres


size_type __CLR_OR_THIS_CALL length() const
{
// return length of sequence
return (_Mysize);
}

读书人网 >C++

热点推荐