C++字符串长度(以字节为单位)

C++ string length in bytes

本文关键字:字节 为单位 字符串 C++      更新时间:2023-10-16
string str; str="hello"; str.length(); sizeof(str);

我看到 str.length 返回以字节为单位的长度,为什么 sizeof(str) 不返回相同的长度?

在 c++ 中是否有替代 c 命令的 strlen(str)?在 c++ 中,这个库曼德的替代方案是什么?

当我在发送函数中使用 winsock 时,我返回以字节为单位的长度。我应该使用什么?长度?还是大小(str)?公关什么?因为我看到它们会产生不同的结果。

sizeof 返回数据结构的大小,而不是包含中的数据的大小。

length() 返回 str 包含的字符串的长度,并且是你想要的函数

这可能看起来令人困惑,因为sizeof(char[30])是30,但这是因为数据结构的大小是30,无论你在其中输入什么,它都将保持30

字符串实际上是一个非常复杂的结构,但假设它是一个带有指针和长度的简单类

class string
{
    char *data;
    int length;
};

然后 sizeof(string) 将返回:

字符 * 指针的大小,可能但不一定是 4

加上 int 的大小,可能但不一定是 4

因此,您可能会得到值 8。数据或长度的值对结构的大小没有影响。

sizeof()并不是

真正用于字符串类的。字符串类不仅存储字符串数据;其数据和 C 样式字符串之间没有区别;它还有其他东西,这抛弃了 sizeof()。若要获取字符串中字符的实际长度,请使用 str.length()
不要在C++字符串对象上使用 C strlen()。也不要使用 sizeof()。使用.length().

C++中的std::string被实例化为指向字符串对象的指针,因为字符串可能具有不同的长度。sizeof()返回的是指向字符串对象的指针的大小(在 32 位机器上可能会4

运算符sizeof()返回给定类型或对象的大小(以字节为单位)。"类型版本"很容易理解,对于"对象版本",您需要记住一件事:

sizeof()仅查看类型定义,并根据其成员的大小和数量推断总大小(通常,多态和多个继承类型可能具有其他"隐藏"成员)。

换句话说,让我们假设我们有:

struct A
{
  int* p1;
  char* p2;
};

正如您可能怀疑的那样,sizeof(A)将返回 8(因为在大多数 32 位系统上指针是 4 字节类型)。但是,当您执行以下操作时:

A a_1;
a_1.p1 = new int[64];

sizeof(a_1)仍将返回 8。这是因为由 new 分配并由 A 的成员指向的内存并不"属于"此对象。

这就是为什么sizeof(str)str.length()给出不同的结果。 std::string为堆上的字符分配内存(动态地,通过 malloc() ),因此它不会更改字符串的大小。

因此,如果要通过网络发送字符串,则需要适当的大小str.len()并且可以通过调用str.c_str()来检索数据指针。

我并没有理解"strlen(str)等价物"。在C++中还有strlen()功能,具有相同的原型,以完全相同的方式工作。它只需要const char*,所以你不能用它来std::string(但你可以做strlen(str.c_str()),因为std::string的内部字符串保证以null结尾)。对于std::string,请像您已经做的那样使用.length()