1

在 C++ 中,我试图获得一个string说“gibbs”的大小;

当我使用sizeof函数时,它返回的尺寸小于实际尺寸之一。

我有以下代码:

 string s = "gibbs";
 cout << sizeof(s) <<endl;

输出是:4。我想应该是 5。

如何解决这个问题。我们可以始终将 +1 添加到 sizeof 的返回,但这会是完美的解决方案吗?

4

4 回答 4

9

sizeof(s)给你对象的大小s,而不是对象中存储的字符串的长度s

你需要这样写:

cout << s.size() << endl;

请注意std::basic_string(并且通过扩展std::string)具有size()成员函数。std::basic_string还有一个length成员函数,它返回与 . 相同的值size()。所以你也可以这样写:

cout << s.length() << endl;

我个人更喜欢size()成员函数,因为标准库中的其他容器,如std::vectorstd::liststd::map等,都有size()成员函数,但没有length()。也就是说,size()是标准库容器类模板的统一接口。我不需要专门为std::string(或任何其他容器类模板)记住它。从这个意义上说,成员函数std::string::length()是一种偏差。

于 2012-08-25T06:09:10.220 回答
4

sizeof(s)在您的示例中返回 的大小std::string,与其成员指向的内容无关。

如何解决这个问题。我们总是可以在 sizeof 的返回值上加上 +1,但这会是完美的解决方案吗?

不,这不会解决任何问题,因为该值是恒定的,并且sizeof没有提供您期望的值。

如果您想知道字符串的字符序列所需的字符数,您可以使用s.length()s.size()-- 在该值上加 1 以了解终止字符串所需的大小。

另请注意,sizeof跨库和平台的值不会保持一致。std::string实现可能会有很大差异。特别是,您可能会看到指针大小的差异,并且您可能会看到小的字符串优化。

于 2012-08-25T06:10:45.213 回答
1

因为这是系统上字符串类型的大小,而不是基础数据的大小。例如:

#include <iostream>

int main (void) {
    std::string s1 = "gibbs";
    std::string s2 = "a much longer string";
    std::cout << sizeof(s1) << '\n';
    std::cout << sizeof(s2) << '\n';

    std::cout << s1.length() << '\n';
    std::cout << s2.length() << '\n';

    return 0;
}

产生:

4
4
5
20

换句话说,您应该使用它std::string::length()来获取字符串的长度。

于 2012-08-25T06:09:06.443 回答
1

sizeof返回对象类型的大小std::string,它恰好4在您的系统上。这可能是因为std::string您正在处理的实现使用pimpl 习惯用法- 即它仅包含指向您正在寻找的实际实现的指针,并且指针在您的主机环境中恰好是 32 位的。不过,您更有可能使用的是的写时复制实现std::string它不再符合 C++11 标准的规范。

std::string被定义为std::basic_string模板类的特化,特别是std::basic_string<char>; 您应该在std::basic_string. 看一下std::basic_string::sizestd::basic_string::length

std::string s = "stackoverflow";
std::assert(s.size() == 13);
于 2012-08-25T06:21:22.693 回答