您的位置:首页 > 编程语言 > C语言/C++

string变量字符串的结束标志是什么,我看书上好像和c不一样,c的char *是以"\0"结束但c++好像不是

2012-03-08 20:18 609 查看

[align=center][/align]



C++标准库的string不是以'\0'结束,而是string类中有一个记录长度的值

(具体怎么实现我不是很清楚,要等看过STL代码或者比我牛的大牛来给你说)

但是C++中的string你要得到它有多长,可以这么做
string str("abc");

str.size();

str.length(); //都返回3

而且,str中不会以'\0'判断字符串结束,可以这样
string str2("\0\0\0\0\0");

str2.size(); //等于5

如果要用string返回一个C style string

那么可以

str.c_str(); //会在字符串内容后加上一个C style string 的结束符号'\0' 这里返回的就是 "abc\0"
str.data(); //这里返回的是 "abc"

 

 

 

嗯,我错了,但是我在看书的时候怎么是这么写的

我找找看

C++ Standard Library : A tutorial and Reference

中11.1章

Unlike C-strings, objects of
class
string have no special character
'\0' at the end of the
string.

Note that only the single-argument version
char* handles the character
'\0'
as a special character that terminates the
string. In all other cases
'\0'
is not a special character:

    std::string s1("nico");       
//initializes s1 with: 'n' 'i' 'c' 'o'
    std::string s2("nico",5)
;     //initializes s2 with: 'n' 'i' 'c' 'o' '\0'
    std::string s3(5,'\0');       
//initializes s3 with: '\0' '\0' '\0' '\0' '\0'

    s1.length()                     //yields 4
    s2.length()                     //yields 5
    s3.length()                     //yields 5

噢~~~ 是我错了,想这样初始化就对了~

std::string s3(5,'\0');       
这样s3 就是 "\0\0\0\0\0"

我那样初始化的确是错的,而且我大概知道错在哪里了~ 想想看~

想好了再跟个贴

C/C++ code

嗯,错在初始化方法相关

string str("\0\0\0");
这里调用的是 string(const char* p) 这个构造函数
这个构造函数的实现应该是依赖C style string的,我大概用自己的想法描述下

string::string(const char* p)
{
  /*
  将string内部的char* mp申请一个p指向的C风格字符串的长度的空间
  将p的内容COPY到mp中
  那么在第一步的时候就使用C风格字符串的判断长度方法,判断这个"\0\0\0"的长度是0
  - - 所以这样的初始化得不到我想要的结果
  */
}

而 string(int count,char ch) 则能得到想要表达STL的string不把'\0'做特殊字符处理的意思

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐