コピーsrc_str先dst_arrとその理由
char dst_arr[10];
char *src_str = "hello";
追伸:良いか悪いかについて多くのことを読んだ後、私の頭は私のコンピューターのディスクよりも速く回転していstrncpyますstrlcpy。
注:strlcpyどこでも利用できるわけではありません。それはここでは問題ではありません。
strncpy宛先文字列がゼロで終わる場合、決して正解ではありません。終了していない固定幅strncpy文字列で使用するための関数です。より正確には、その目的は、ゼロで終わる文字列を (コピーによって) 終了しない固定幅文字列に変換することです。つまり、ここでは意味のある適用はできません。strncpy
ここでの本当の選択肢は、strlcpyと plainの間ですstrcpy。
への「安全な」(つまり潜在的に切り詰められた) コピーを実行したい場合dst_arr、使用する適切な関数はstrlcpy.
についてはdst_ptr… 「コピー先dst_ptr」というものはありません。が指すメモリにコピーできますdst_ptrが、最初にそれがどこかを指していることを確認し、そのメモリを割り当てる必要があります。それにはさまざまな方法があります。
たとえば、dst_ptrを指すようにすることができますdst_arr。この場合、答えは前のケースと同じです - strlcpy。
または、 を使用してメモリを割り当てることができますmalloc。割り当てたメモリの量が文字列に対して十分であることが保証されている場合 (つまり、少なくともstrlen(src_str) + 1バイトが割り当てられている場合)、プレーンを使用するか、文字列をコピーすることstrcpyさえできます。memcpyこの場合、使用する必要も理由もありませんが、使用するstrlcpyことを好む人もいるかもしれません。
意図的に少ないメモリを割り当てる場合 (つまり、文字列を切り捨てたい場合) は、strlcpy使用するのに適した関数になります。
strlcpy()よりも安全なstrncpy()ので、使用することもできます。
それを持たないシステムには、多くの場合s_strncpy()、同じことを行う があります。
注dst_ptr:何かを指すまで、何もコピーできません
strlcpy は知りませんでした。私はここでそれを見つけました:
strlcpy() および strlcat() 関数は、それぞれ文字列をコピーおよび連結します。これらは、strncpy(3) および strncat(3) の代わりに、より安全で一貫性があり、エラーが発生しにくいように設計されています。
したがって、strlcpy シームはより安全です。
編集: 完全な議論はここで利用可能です。
編集2:
私が上に書いたことは、あなたの質問の「あなたの場合」の部分に答えていないことを理解しています. strncpy の制限を理解していれば、strncpy を使用して適切なコードを記述し、その落とし穴を回避できると思います。ただし、その制限を理解しているかどうかわからない場合は、strlcpy を使用してください。
strncpy と strlcpy の制限についての私の理解では、strncpy で非常に悪いこと (バッファ オーバーフロー) を行うことができ、strlcpy でできる最悪のことは、その過程で 1 文字を失うことです。
これには strncpy や strlcpy を使用しないでください。使った方がいい
*dst_arr=0; strncat(dst_arr,src_arr,(sizeof dst_arr)-1);
または初期化なし
sprintf(dst_arr,"%.*s",(sizeof dst_arr)-1,src_arr);
ここで dst_arr は、ポインターではなく配列でなければなりません。
まず第一に、あなたの dst_ptr にはスペースが割り当てられておらず、他のものを指すように設定していないため、それに何かを割り当てるとおそらくセグメンテーション違反が発生します.
Strncpy は問題なく動作するはずです。
strncpy(dst_arr, src_str, sizeof(dst_arr));
そして、dst_arr をオーバーフローさせないことがわかっています。より大きな src_str を使用する場合は、dst_arr の最後に独自のヌル ターミネータを配置する必要があるかもしれませんが、この場合、ソースが宛先よりも小さいため、とにかくヌルでパディングされます。
これはどこでも機能し、安全であるため、知的好奇心がない限り、他のものには目を向けません。
また、strncpy のサイズと一致するサイズがわかるように、10 に非マジック ナンバーを使用することをお勧めします:)