string str; str="hello"; str.length(); sizeof(str);
我看到str.length返回sizeof(str)不返回的长度(以字节为单位)?
在c ++中是否有替代strlen(str)的c命令?在c ++中,这个命令的替代方法是什么?
当我在send函数中使用winsock时,我返回以字节为单位的长度。我该怎么用? str.length?或sizeof(str)?还有别的什么?因为我看到它们会产生不同的结果。
答案 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)
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()
就像你已经做过的那样。