Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.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++ 字符串长度()与字符数组strlen_C++ - Fatal编程技术网

C++ 字符串长度()与字符数组strlen

C++ 字符串长度()与字符数组strlen,c++,C++,我正在捕获网络数据包的有效负载。有效负载为字符串形式。然后我将字符串转换为字符数组。现在,我想计算每个数据包负载的大小 string payload; payload = raw_payload->GetStringPayload(); char input[payload.length()]; strcpy(input,payload.c_str()); int size; size=strlen(input); LOGfile_length << size <<

我正在捕获网络数据包的有效负载。有效负载为
字符串形式。然后我将
字符串
转换为
字符数组
。现在,我想计算每个数据包负载的大小

string payload;
payload = raw_payload->GetStringPayload();
char input[payload.length()];
strcpy(input,payload.c_str());
int size;
size=strlen(input);
LOGfile_length <<  size << " " << payload.length()  << endl;
现在,我正在这样做

memcpy ( input,  payload.c_str(), strlen(payload.c_str())+1 );
但是数据包的大小仍然不同

将代码更改为

char input[payload.length()+1];
这是因为payload.length将返回字符串中的字符数。我们还需要一个字节来存储'\0'字符


希望这会有所帮助。

我怀疑这是因为您的有效负载包含
\0
字符

您可以使用以下代码轻松地进行检查:

for(int i=0; i<payload.length(); i++) printf("%d\n", payload.c_str()[i]);

<代码> >(int i=0;i <代码> STRPY < /COD>和<代码> STRLIN/<代码>在输入中遇到NUL(0字节)时将停止。NULs很可能出现在网络分组数据的中间,这意味着在第一个NUL之后不会看到任何包数据。

一种有效的方法是使用
string::length()
memcpy

string payload = raw_payload->GetStringPayload();
char input[payload.length()];
size_t size = payload.length();
memcpy(input, payload.c_str(), size);
LOGfile_length << size << " " << payload.length() << endl;
stringpayload=raw_payload->GetStringPayload();
字符输入[payload.length()];
size_t size=有效载荷.length();
memcpy(输入,payload.c_str(),大小);

LOGfile_length您的字符串是否包含空字符?@Namfuak这是最可能的原因。但他的代码确实依赖于编译器特定的扩展名(用于本地C样式数组长度的变量)和未定义的行为(如果他确实将所有
有效负载
复制到
输入
)。但是,是的,strcpy将在第一个\0之后停止。如果您真的想移动到普通C对象,我建议在这里使用memcpy:)啊,我明白了。“是的,<代码> char输入[动态()] //>绝对不正确。@ JAMESKANZE:得到它,是因为C++数组长度应该是ICE,而且如果他复制了所有的,则<代码> 0代码>代码将超出数组的长度。是的,<代码> MycPy < /C>将有帮助,但也使用<代码>有效载荷。但事实并非如此。您可以看到
strlen
值总是较小,因此,
\0
永远不会被放在缓冲区之外。网络数据包不应被视为文本,因为它们是
uint8\u t
的数组@Zara:尝试对没有nul的文本使用
memcpy
,或者应用nul并将其作为数据包字节之一计算。@DavidRodríguez dribeas:问题是“为什么我看到大小不一致”请检查我的代码并找出所有错误“。因此,关于OP的问题,答案对OP毫无用处。@Plasmah:假设其他问题已解决,测试将重新运行。”。差异会消失吗?它会在另一个方向上显示差异吗?去过那里,做过几次。问题已经解决,一个不同的(可能)相关问题再次出现,问题不断更新,问题变得令人困惑,因为存在不同的问题,每个答案解决其中一个问题……网络数据包最好被视为字节数组或
uint8_t
,而不是文本字符串。文本字符串需要一个终止nul。“不能放入纯C字符串”在这里是一个很糟糕的措辞。您可以将空字节放在那里,原因是
strlen
将它们解释为终止符,因此返回的字符串长度与预期长度不同。您可以使用
char*
存储这些对象,但不应将它们称为“strings”,也不应使用
string.h
中的方法:)
memcpy
-好的,
strcpy
-不是。我会添加
if(payload.c_str()[I]==0)
,只是为了从手动检查1448字节中保存OP:)@我使用了memcpy,但结果似乎还是一样的。请帮助我还有什么我可以做的,因为在最后我需要在字符数组形式的数据包有效载荷。
for(int i=0; i<payload.length(); i++) 
  if(payload.c_str()[i]==0) 
    printf("Found \\0 at %d\n", i);
string payload = raw_payload->GetStringPayload();
char input[payload.length()];
size_t size = payload.length();
memcpy(input, payload.c_str(), size);
LOGfile_length << size << " " << payload.length() << endl;