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

时间:2013-10-30 15:39:12

标签: c++ string

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

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

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

当我在send函数中使用winsock时,我返回以字节为单位的长度。我该怎么用? str.length?或sizeof(str)?还有别的什么?因为我看到它们会产生不同的结果。

4 个答案:

答案 0 :(得分:3)

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

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

因为sizeof(char [30])是30,所以看起来有点令人困惑,但这是因为数据结构的大小是30,无论你放入什么内容都将保持30

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

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

然后sizeof(string)将返回:

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

C ++中的

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

答案 3 :(得分: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.这是因为由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()就像你已经做过的那样。