std ::带有和没有\ 0终止的字符串

时间:2015-05-11 07:15:58

标签: c++

我们假设我创建了一个这样的字符串:

std::string s1 = "";
s1 += 'a';
s1 += 'b';

然后就是这样:

std::string s2 = std::string( "ab" );

s1s2是否相等?创建\0时,"ab"是否会从s2中删除?如果没有,是否有一种简单的(一行,最好)方式来检查s1是否仅包含{'a', 'b'}

2 个答案:

答案 0 :(得分:2)

  

s1和s2是否相等?

  

是否从" ab"剥离了\ 0什么时候创建s2?

这不是一个有意义的问题。构造s2的代码可以根据需要构造。它可以复制终结器,删除它,保留它,无论它想要什么。它只需要知道如何找到C风格字符串的结尾,它确实如此。

  

如果没有,是否有一种简单的(一行,最好)方式来检查s1是否仅包含{' a'' b'}?

if (s1 == "ab")

string类有一个operator==可以达到你所期望的效果,比较等价值。它理解C风格和C ++风格的字符串是如何工作的,因此可以比较它们的值。

答案 1 :(得分:0)

使用方法大小()很容易确定会发生什么。

例如,在创建像这样的对象

之后
std::string s1 = "";

s1的大小将等于0.

这里称为构造函数

basic_string(const charT* s, const Allocator& a = Allocator());

复制第一个元素由s指向的数组中的字符。由于字符串文字“”的长度等于0,因此构造的对象也没有元素,其大小等于0。

在这些陈述之后

s1 += 'a';
s1 += 'b';

该对象将包含两个字符'a'和'b'。 因此,对象将等于std::string( "ab" );构建的对象。

例如,如果您有一个像

这样的字符数组,请考虑

char s [] = {'a','b','\ 0','c','d','\ 0'};

将用于构造类似std :: string的对象,如此

std::string s1( s );

然后s1将只包含两个元素'a'和'b',其大小将等于2.

考虑另一个例子会很有用。我们假设你写了

std::string s1 = "";

然后

s1 += 'a';
s1 += 'b';
s1 += '\0';

在这种情况下,s1将不等于对象std::string( "ab" ),因为s1的大小现在等于3.

另一个有趣的例子。您可以使用构造函数

basic_string(const charT* s, size_type n, const Allocator& a = Allocator());

它类似于前面的构造函数,除了它允许显式指定指针s指向的字符数组中的字符数,这些字符数将用于构造std :: string类型的对象。 在这种情况下,如果你要写

std::string s1( "ab", 3 );
std::cout << s1.size() << std::endl;

if ( s1 == std::string( "ab" ) ) std::cout << "They are equal" << std::endl;
else std::cout << "They are not equal" << std::endl;

然后输出

3
They are not equal

同时如果你要写

std::cout << s1 << std::endl;

你会看到

ab