は、C++標準ライブラリではstrncpyに相当正確なありますか?私は終わりの0に達するまで、あるバッファから別のバッファに文字列をコピーする関数を意味しますか?たとえば、TCPパケットなどの安全でないソースから文字列を解析する必要がある場合、データを処理しながら長さのチェックを実行できます。std :: stringと同じstrncpyですか?
私はすでにこのトピックに関してたくさんの検索を行いましたが、興味深いトピックもいくつか見つかりましたが、これらの人々はすべて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++標準ライブラリに実装され、このための解決策があった場合、私はそれを好みます。
'std :: string'sはNULLで終了しません。文字列のコピー、または最初のヌルバイトまでのすべてのコピーを必要としますか(それは存在する場合としない場合があります)? –
ああ、知っておいてよかった。私は最初のnullバイトまですべてをコピーしたいと思います。 – athre0z
[頼むように気をつけてください](http://the-flat-trantor-society.blogspot.com/2012/03/no-strncpy-is-not-safer-strcpy.html) –