C++ 标准库中是否有与strncpy完全等价的功能?我的意思是一个函数,它将一个字符串从一个缓冲区复制到另一个缓冲区,直到它到达终止 0?例如,当我必须解析来自不安全来源的字符串(例如 TCP 数据包)时,我可以在处理数据时执行长度检查。
我已经搜索了很多关于这个主题的内容,并且还发现了一些有趣的主题,但是所有这些人都对 std::string::assign 感到满意,它还能够将要复制的字符大小作为参数。我对这个函数的问题是,如果终止 null 已经被命中,它不会执行任何检查 - 它会认真对待给定的大小并将数据复制到memcpy将其复制到字符串的缓冲区中。这样,如果在应对时进行了这样的检查,则分配和复制的内存比必须完成的要多得多。
这就是我目前解决此问题的方式,但我希望避免一些开销:
// Get RVA of export name
const ExportDirectory_t *pED = (const ExportDirectory_t*)rva2ptr(exportRVA);
sSRA nameSra = rva2sra(pED->Name);
// Copy it into my buffer
char *szExportName = new char[nameSra.numBytesToSectionsEnd];
strncpy(szExportName,
nameSra.pSection->pRawData->constPtr<char>(nameSra.offset),
nameSra.numBytesToSectionsEnd);
szExportName[nameSra.numBytesToSectionsEnd - 1] = 0;
m_exportName = szExportName;
delete [] szExportName;
这段代码是我的 PE 二进制文件解析器的一部分(准确地说,是解析导出表的例程)。rva2sra将一个相对虚拟地址转换为一个 PE 段相对地址。ExportDirectory_t结构包含二进制文件导出名称的 RVA,它应该是一个以零结尾的字符串。但情况并非总是如此 - 如果有人愿意,它可以省略终止零,这会使我的程序运行到不属于该部分的内存中,最终会崩溃(在最好的情况下......)。
自己实现这样的功能不是什么大问题,但如果在 C++ 标准库中实现了这个功能,我会更喜欢它。