读书人

通过测试发现string类字符串同样是

发布时间: 2012-03-30 17:32:09 作者: rapoo

通过测试发现,string类字符串,同样是以'\0'作为字符串结束标记的。
通过测试发现,string类字符串,同样是以'\0'作为字符串结束标记的。

看到很多网友,一致的认为,string类中的字符串,不是以'\0'作为结束标记的,'\0'就是普通的字符
但是,通过我自己的测试,发现与大多数网友的理解并不相同。

大家说说呢?

C/C++ code
#include "stdafx.h"#include <iostream>#include <string>using namespace std;int main(int argc, char* argv[]){    string ss="helllworld";    ss[3]='8';    cout << ss << endl;    ss[3]='\0';    cout << ss << endl;    return 0;}


[解决办法]
呵呵,楼主有心了!
[解决办法]
lz喜欢专研问题,不错,表扬下
[解决办法]
接楼主地盘问一下, 我想知道
string str;
str.c_str();转换为char *, 怎样转换为宽字符的wchar_t *。
[解决办法]
string ss="helllworld";
string虽然有size()成员函数,但是仍然是从C字符串的'\0'为标志的,从而获取需要拷贝的大小
而且其c_str()转为的也是C字符串,以'\0'结尾
[解决办法]
这个不能说明问题吧,对象的核心就是封装,只能说\0影响了string对象,谁也不知道string是怎么实现的,而且不同的公司不同的实现,只要接口对了就行
[解决办法]
阁下研究的是c++语言之外的东西,一个类用起来如何如何只能说明我们的熟练程度。
另外,我要奉劝一句,不要相信输出语句输出的东西,那些都是便于人来看的。不总是能说明内在的实质,很简单的例子能 通过 char* pchar; cout<<pchar 来打印pchar 所代表的地址吗?
[解决办法]
支持10楼的结论,“不同的公司不同的实现,只要接口对了就行”。。。

楼主你的结论错了吧?我用你的代码在VS2005上发现输出分别是hel8lworld,hel lworld,结论应该是微软版本的string类中'\0'只是普通字符,'\0'后面的字符仍然能够输出。。。
[解决办法]
探讨
通过测试发现,string类字符串,同样是以'\0'作为字符串结束标记的。

看到很多网友,一致的认为,string类中的字符串,不是以'\0'作为结束标记的,'\0'就是普通的字符
但是,通过我自己的测试,发现与大多数网友的理解并不相同。

大家说说呢?

C/C++ code

#include "stdafx.h"
#include <iostream>
#includ……

[解决办法]
string本身可以存储二进制数据,并不一定以0x00结尾。

输出结果不代表任何东西,可能会在0x00截断而已
[解决办法]
哎,我最担心这些不肯查手册,就自己靠“试”来学东西的,经常以偏概全啥的自己误导自己。
[解决办法]
我也同意10楼,楼主用iterator遍历一下试试。再看看size(), length()各是啥。
[解决办法]
LZ犯了个大错误,string本身自己有一套管理字符串长度的管理机制,这个机制并不要求字符串以什么结尾,也就是允许包含\0数据,但是那些操作C风格字符串的函数会把那些\0当作结尾。
cout是基本C++运行库函数,它处理字符串的时候是以\0结尾的,这个特性是兼容C风格的。而string属于STL,STL是扩充的C++功能。
不带检查特性的[]操作符里给字符串某个位置赋值\0,并不会影响字符串自己存储的长度,也不会导致字符串被自动截断。
用ss.data()获得的string内容就不包含\0结尾,是单纯的字符数组。ss.c_str()会产生\0结尾的C风格字符串,string重载的<<操作符类似,也会加上\0结尾。

读书人网 >C++

热点推荐