代码中 strncpy 到 strcpy 的等效性
strncpy To strcpy Equivilence in Code
我有这个丑陋的功能,我觉得整个strncpy
应该只是一个strcpy
:
void PackData(char*& cursor, const std::string& data) {
*(reinterpret_cast<int*>(cursor)) = static_cast<short>(data.length() + 1);
cursor += sizeof(int);
// copy the text to the buffer
::strncpy(cursor, data.c_str(), data.size());
cursor += (data.length() * sizeof(char));
*(reinterpret_cast<char*>(cursor)) = 0;
cursor += sizeof(char);
}
cursor
保证有足够的空间来包含所有复制的数据。并且 data
在终止处仅包含一个 '[=16=]'
字符。
我想更新此功能以使用 strcpy
,并删除一些丑陋的内容。这是我拥有的:
void PackData(char*& cursor, const std::string& data) {
const int size = data.size() + 1;
std::copy_n(cursor, sizeof(int), reinterpret_cast<char*>(&size));
cursor += sizeof(int);
strcpy(cursor, data.c_str());
cursor += size;
}
我的代码工作正常,但我想问一下是否有人看到我可能遗漏的任何不当行为?
编写该代码的人都不知道他们在做什么。 strncpy
的使用没有任何意义,因为在调用中传递给它的长度是源的长度,而不是目标的长度。最后的 reinterpret_cast
只是将 cursor
转换为其原始类型。摆脱这种废话。您的代码是一个很好的替代品。
我有这个丑陋的功能,我觉得整个strncpy
应该只是一个strcpy
:
void PackData(char*& cursor, const std::string& data) {
*(reinterpret_cast<int*>(cursor)) = static_cast<short>(data.length() + 1);
cursor += sizeof(int);
// copy the text to the buffer
::strncpy(cursor, data.c_str(), data.size());
cursor += (data.length() * sizeof(char));
*(reinterpret_cast<char*>(cursor)) = 0;
cursor += sizeof(char);
}
cursor
保证有足够的空间来包含所有复制的数据。并且 data
在终止处仅包含一个 '[=16=]'
字符。
我想更新此功能以使用 strcpy
,并删除一些丑陋的内容。这是我拥有的:
void PackData(char*& cursor, const std::string& data) {
const int size = data.size() + 1;
std::copy_n(cursor, sizeof(int), reinterpret_cast<char*>(&size));
cursor += sizeof(int);
strcpy(cursor, data.c_str());
cursor += size;
}
我的代码工作正常,但我想问一下是否有人看到我可能遗漏的任何不当行为?
编写该代码的人都不知道他们在做什么。 strncpy
的使用没有任何意义,因为在调用中传递给它的长度是源的长度,而不是目标的长度。最后的 reinterpret_cast
只是将 cursor
转换为其原始类型。摆脱这种废话。您的代码是一个很好的替代品。