多くの人々は、すでに代替のstrcpyのはstrncpyの使用は、国境を越えた緩衝地帯を防ぐためにことを知っています。
あなたはまた、運用効率を考慮した場合でも、おそらくstrlcpyには良い方法です。
1. strcpyの
それは空間に十分でない場合、我々は知っている、strcpyのは、判決の最後として、\ 0に基づいており、バッファオーバーフローが発生します。(OpenBSDの3.9から)次のようにstrcpyの従来のコードは次のとおりです。
チャー*の
(からのchar *に、CONSTのchar *)strcpyの
{
CHAR *に保存=。
用(;(*へ= * = '')から;!++へ++、から)。
(保存)を返します。
}
しかし、一般的には、当社のユーザーの入力から導出されているので、十分に安全ではないstrcpyの、非常に大きな文字列である可能性が高いです。
2. strncpyを
ANSI Cでは、安全なバージョンはstrcpyのはstrncpyです。
するchar *はstrncpy(チャー* S1と、CONSTのchar * S2と、size_tのN)。
strncpyをしかし、彼らの行動は非常に奇妙である(ない私たちのいつもの習慣に沿って)。標準数Nチャーはsizeof(S1)ではなく、コピーします。最も一般的な問題の一つは、strncpyをはあなたを助けるために終わりを保証するものではないということです。
チャーBUF [8]。
strncpyを(BUF、 "ABCDEFGH"、8)。
このプログラムを見て、bufがターミネータ埋める「ABCDEFGH」ではなくなります。
含有量が少ないとN S2と比較的大きい場合、さらに、その後、strncpyをの間の空間が充填されるであろう。次のようにそれは、効率性の問題が登場しました。
チャーBUF [80]。
strncpyを(BUF、 "ABCDEFGH"、79);
上記のstrncpyではなく、単に「ABCDEFGH」そのものよりも、79文字を記入します。
strncpyを標準的な使用法は、:(上に手書きで)
strncpyを(パス、SRC、はsizeof(パス) - 1)。
パス【はsizeof(パス) - 1] = '';
LEN = strlenを(パス)。
3. strlcpyに
//サイズSIZの文字列をdstにコピーSRC。最もSIZ-1文字で
//コピーされます。常にNULは(SIZ == 0ない限り)を終了します。
//戻り値のSTRLEN(SRC); RETVAL> = SIZ場合、切り捨てが発生しました。
size_tの
strlcpyに(のchar * dstは、CONSTするchar * SRC、size_tのSIZ)。
使用strlcpyには、我々は\ 0を担当して手を移動し、ただのsizeof(DST)strlcpyには発表するために行う必要はありません。
strlcpyに(パス、SRC、はsizeof(パス))。
LEN = strlenを(パス)。
もし(LEN> =はsizeof(パス))
のprintf( "srcが切り捨てられます。")。
そして、(文字列)をstrlenをされて返さstrlcpyに、私たちは簡単にデータが切り捨てられているかどうかを判断することができます。
[*少し歴史*]
ANSI C、これまでにない標準の一部ではないstrlcpyに。
strlcpyには、OpenBSD 2.4から、後にUNIXライクなシステムのlibcの多くは、strlcpyにを発見されたFreeBSDの、Linuxでのstrlcpyに機能に参加しています。(Linuxのglibcのを使用して、そこにstrlcpyにはglibcは、すべてのLinuxバージョンでは、strlcpyにする必要があります)
Windowsは何strlcpyにされていない下しかし、対応する機能がstrcpy_sです
ます。https://www.cnblogs.com/shelvenn/archive/2008/02/15/1069656.htmlで再現