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++ 標準ライブラリに実装されている解決策があれば、それを望んでいます。