ath*_*e0z 7 c++ string strncpy
是否有一个确切相当于strncpy()函数的C++标准库中?我的意思是一个函数,它将一个字符串从一个缓冲区复制到另一个缓冲区,直到它到达终止0?例如,当我必须从不安全的源解析字符串时,例如TCP数据包,所以我能够在处理数据时执行长度检查.
我已经搜索了很多关于这个主题的内容,我也发现了一些有趣的话题,但所有这些人都对std :: string :: assign感到满意,它也可以将一个字符大小复制为参数.我对这个函数的问题是,它不会执行任何检查,如果已经命中了终止空值 - 它需要给定的大小严重并且像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;
Run Code Online (Sandbox Code Playgroud)
这段代码是我的PE-binaries解析器的一部分(准确地解析导出表的例程).rva2sra将相对虚拟地址转换为PE节相对地址.该ExportDirectory_t结构包含RVA二进制,其中出口名称应该是零结尾的字符串.但事情并非总是如此 - 如果有人想要它,它将能够省略终止零,这将使我的程序运行到不属于该部分的内存中,它最终会崩溃(在最好的情况下...).
我自己实现这样的功能不是一个大问题,但如果在C++标准库中实现了这个解决方案,我更喜欢它.
Set*_*gie 11
如果您知道要创建的缓冲区string中至少有一个NUL,那么您可以将其传递给构造函数:
const char[] buffer = "hello\0there";
std::string s(buffer);
// s contains "hello"
Run Code Online (Sandbox Code Playgroud)
如果您不确定,那么您只需要在字符串中搜索第一个null,并告诉构造函数string复制那么多数据:
int len_of_buffer = something;
const char* buffer = somethingelse;
const char* copyupto = std::find(buffer, buffer + len_of_buffer, 0); // find the first NUL
std::string s(buffer, copyupto);
// s now contains all the characters up to the first NUL from buffer, or if there
// was no NUL, it contains the entire contents of buffer
Run Code Online (Sandbox Code Playgroud)
您可以将第二个版本(即使缓冲区中没有NUL也能正常工作)包装成一个整洁的小函数:
std::string string_ncopy(const char* buffer, std::size_t buffer_size) {
const char* copyupto = std::find(buffer, buffer + buffer_size, 0);
return std::string(buffer, copyupto);
}
Run Code Online (Sandbox Code Playgroud)
但有一点需要注意:如果单独使用单参数构造函数const char*,它将一直运行直到找到NUL.重要的是,如果使用单参数构造函数,则知道缓冲区中至少有一个NULstd::string.
不幸的是(或幸运),没有内置的完美等同strncpy的std::string.