Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何查找包含零作为元素的字符数组的长度_C++_Char - Fatal编程技术网

C++ 如何查找包含零作为元素的字符数组的长度

C++ 如何查找包含零作为元素的字符数组的长度,c++,char,C++,Char,不知道如何找到字符数组的长度。 比如说 char buffer[20]; buffer[0] = 0x01; buffer[1] = 0x02; buffer[3] = 0x00; buffer[4] = 0x04; buffer[5] = 0x01; buffer[6] = 0x02; buffer[7] = 0x00; buffer[8] = 0x04; std::cout << "the len of array = "<< strlen(buffer) <

不知道如何找到字符数组的长度。 比如说

char buffer[20];
buffer[0] = 0x01;
buffer[1] = 0x02;
buffer[3] = 0x00;
buffer[4] = 0x04;
buffer[5] = 0x01;
buffer[6] = 0x02;
buffer[7] = 0x00;
buffer[8] = 0x04;

std::cout << "the len of array = "<< strlen(buffer) << std::endl;

o/p = the len of array = 3
char缓冲区[20];
缓冲区[0]=0x01;
缓冲区[1]=0x02;
缓冲区[3]=0x00;
缓冲区[4]=0x04;
缓冲区[5]=0x01;
缓冲区[6]=0x02;
缓冲区[7]=0x00;
缓冲区[8]=0x04;
C(或C++)中的std::cout数组不跟踪其中存储了多少数据。如果您想知道存储数据的大小(与数组的大小相反),则需要在另一个变量中自己跟踪该大小,或者使用标记存储数据结束的哨兵(如NULL)

另一方面,由于您使用C++(尽管C++标记),您可以使用<代码> STD::vector < /COD>或<代码> STD::String ,它跟踪您的大小。

< P>数组(C或C++)不跟踪已经存储了多少数据。如果您想知道存储数据的大小(与数组的大小相反),则需要在另一个变量中自己跟踪该大小,或者使用标记存储数据结束的哨兵(如NULL)


另一方面,由于您使用C++(尽管C++标记),您可以使用<代码> STD::Vector 或<代码> STD::String ,它跟踪您的大小。

< P> C++中,您将使用<代码> STD::vector < /COD>或<代码> STD::String 。两者都独立于数据存储长度,因此可以在其中保留零

请注意,“c”样式的文本字符串总是以零结尾,因此以下代码将为您提供一个空字符串,因为NUL会提前终止字符串构造

std:string foo("\0Hello, world!");

<>在C++中,你将使用<代码> STD::vector < /COD>或<代码> STD::String 。两者都独立于数据存储长度,因此可以在其中保留零

请注意,“c”样式的文本字符串总是以零结尾,因此以下代码将为您提供一个空字符串,因为NUL会提前终止字符串构造

std:string foo("\0Hello, world!");

当您有一个数组时,您可以使用
sizeof
获取该数组使用的总内存

char buffer[20];
// 
// ...
//

size_t size = sizeof(buffer); // This gives you total memory needed to hold buffer.
size_t length = sizeof(buffer)/sizeof(char); // In this case size and length will be
                                             // same since sizeof(char) is 1.
void foo(char* buffer)
{
   size_t size = sizeof(buffer); // This gives you the size of the pointer
                                 // not the size of the array.
}

void bar()
{
   char buffer[20];

   // sizeof(buffer) is 20 here. But not in foo.

   foo(buffer);
}
如果有其他类型的数组

int buffer[20];
// 
// ...
//

size_t size = sizeof(buffer); // This gives you total memory needed to hold buffer.
size_t length = sizeof(buffer)/sizeof(int); // The length of the array.
使用
sizeof
获取数组使用的内存时,需要注意一些陷阱。如果将
buffer
传递给函数,则会失去计算数组长度的能力

char buffer[20];
// 
// ...
//

size_t size = sizeof(buffer); // This gives you total memory needed to hold buffer.
size_t length = sizeof(buffer)/sizeof(char); // In this case size and length will be
                                             // same since sizeof(char) is 1.
void foo(char* buffer)
{
   size_t size = sizeof(buffer); // This gives you the size of the pointer
                                 // not the size of the array.
}

void bar()
{
   char buffer[20];

   // sizeof(buffer) is 20 here. But not in foo.

   foo(buffer);
}
如果您需要能够随时计算数组的长度,
std::vector
std::string
是更好的选择

void foo(std::vector<char>& buffer)
{
   size_t size = buffer.size() // size is 20 after call from bar.
}

void bar()
{
   std::vector<char> buffer(20);
   size_t size = buffer.size() // size is 20.

   foo(buffer);
}
void foo(标准::向量和缓冲区)
{
size\u t size=buffer.size()//从bar调用后,大小为20。
}
空条()
{
std::向量缓冲器(20);
size\u t size=buffer.size()//大小为20。
foo(缓冲区);
}

当您有一个数组时,您可以使用
sizeof
获取该数组使用的总内存

char buffer[20];
// 
// ...
//

size_t size = sizeof(buffer); // This gives you total memory needed to hold buffer.
size_t length = sizeof(buffer)/sizeof(char); // In this case size and length will be
                                             // same since sizeof(char) is 1.
void foo(char* buffer)
{
   size_t size = sizeof(buffer); // This gives you the size of the pointer
                                 // not the size of the array.
}

void bar()
{
   char buffer[20];

   // sizeof(buffer) is 20 here. But not in foo.

   foo(buffer);
}
如果有其他类型的数组

int buffer[20];
// 
// ...
//

size_t size = sizeof(buffer); // This gives you total memory needed to hold buffer.
size_t length = sizeof(buffer)/sizeof(int); // The length of the array.
使用
sizeof
获取数组使用的内存时,需要注意一些陷阱。如果将
buffer
传递给函数,则会失去计算数组长度的能力

char buffer[20];
// 
// ...
//

size_t size = sizeof(buffer); // This gives you total memory needed to hold buffer.
size_t length = sizeof(buffer)/sizeof(char); // In this case size and length will be
                                             // same since sizeof(char) is 1.
void foo(char* buffer)
{
   size_t size = sizeof(buffer); // This gives you the size of the pointer
                                 // not the size of the array.
}

void bar()
{
   char buffer[20];

   // sizeof(buffer) is 20 here. But not in foo.

   foo(buffer);
}
如果您需要能够随时计算数组的长度,
std::vector
std::string
是更好的选择

void foo(std::vector<char>& buffer)
{
   size_t size = buffer.size() // size is 20 after call from bar.
}

void bar()
{
   std::vector<char> buffer(20);
   size_t size = buffer.size() // size is 20.

   foo(buffer);
}
void foo(标准::向量和缓冲区)
{
size\u t size=buffer.size()//从bar调用后,大小为20。
}
空条()
{
std::向量缓冲器(20);
size\u t size=buffer.size()//大小为20。
foo(缓冲区);
}

std::end(缓冲区)-std::begin(缓冲区)
@juanchopanza:他确实要求预期的输出为8,这是毫无意义的,因为他在缓冲区中存储了9个字符。@chrisdd:他实际上存储了8个字符,尽管不是连续的。你的问题实际上毫无意义。你需要澄清你想做什么。@juanchopanza你和我都知道你不能区分直接写入数组的数据和未初始化的数据。OP没有,所以这个问题对他来说是有意义的。
std::end(buffer)-std::begin(buffer)
@juanchopanza:他确实要求预期的输出为8,这是毫无意义的,因为他在缓冲区中存储了9个字符。@chrisdd:他实际上存储了8个字符,尽管不是连续的。你的问题实际上毫无意义。你需要澄清你想做什么。@juanchopanza你和我都知道你不能区分直接写入数组的数据和未初始化的数据。OP没有,所以这个问题对他来说很有意义。谢谢你的回复。问题是我想将结构复制到char*。现在,我的结构包含sub_结构和std::vector,其结构与元素相同。现在我不能直接使用memcpy作为struct have vectors,所以为什么我要将元素从我的主结构复制到缓冲区数组,然后在第8个元素之后,我将使用类似memcpy(&buffer[9]、&main.struct.struct_in_vec[0]、sizeof(struct_in_vec)之类的东西。请注意,存储的数据似乎不是连续的,使用了这个术语“长度"这个问题更荒谬。谢谢你的回答。问题是我想把结构复制到char*。现在我的结构包含子结构加上std::vector,其中的structures作为元素。现在我不能直接使用memcpy,因为struct have vectors,所以我为什么要将元素从我的主结构复制到缓冲区数组,然后在第8个之后元素i将使用类似于memcpy(&buffer[9]、&main.struct.struct_in_vec[0]、sizeof(struct_in_vec)bla bla的内容注意,存储的数据似乎不是连续的,使用了术语“length”这个问题更荒谬。非常感谢Roddy,我也可以使用ostringstream,对吗?我会尝试一下,让你们知道有没有一种方法可以复制std::Strings中的结构或包含结构的向量。非常感谢Roddy,我也可以使用ostringstream,对吗?我会尝试一下,让你们知道有没有一种方法可以复制结构包含std::string中结构的or向量