通过测试发现,string类字符串,同样是以'\0'作为字符串结束标记的。该怎么处理
通过测试发现,string类字符串,同样是以'\0'作为字符串结束标记的。
通过测试发现,string类字符串,同样是以'\0'作为字符串结束标记的。
看到很多网友,一致的认为,string类中的字符串,不是以'\0'作为结束标记的,'\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本身可以存储二进制数据,并不一定以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结尾。
通过测试发现,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本身可以存储二进制数据,并不一定以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结尾。