2
string str; str="hello"; str.length(); sizeof(str);

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

c++ 中是否有替代 ac 命令的替代方法,即 strlen(str)?c++ 中这个 coomand 的替代方法是什么?

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

4

4 回答 4

4

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

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

因为 sizeof(char[30]) 是 30,所以看起来很混乱,但那是因为数据结构的大小是 30,无论你放什么都将保持 30

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

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

然后 sizeof(string) 将返回:

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

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

所以你可能会得到一个 8 的值。 data 或 length 的值对结构的大小没有影响。

于 2013-10-30T15:42:52.060 回答
2

sizeof()并不是真的要在字符串类上使用。字符串类不只存储字符串数据;它的数据和 C 风格的字符串没有区别;它还有其他东西,它会抛出 sizeof()。要获取字符串中字符的实际长度,请使用str.length().
不要在 C++ 字符串对象上使用 C strlen()。也不要使用 sizeof() 。利用.length().

于 2013-10-30T15:43:54.047 回答
0

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

于 2013-10-30T15:45:19.467 回答
0

运算符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' 的内部字符串保证以空值结尾)。像你已经做的那样std::string使用。.length()

于 2013-10-30T15:56:37.043 回答