基本的には1996年に導入されたstrlcpy
を再発明している:私はあなたが何をしようとして理解し、少なくともあれば、私はおそらくこのような何かをしたいですミラーとテオ・デ・ラート。 glibcの管理者が "恐ろしく非効率的なBSDのクラップ"と呼ばれ、他のすべてのオペレーティングシステムで採用されても今日まで戦ったのはrefused to be added to glibcだったからです.Damien Millerの論文(第4部:正しいAPI)。
libbsdプロジェクト(Debian、Ubuntu、およびその他のディストリビューションにパッケージ化されています)を使ってLinux上でstrlcpyを使用することも、簡単にWeb上に見つかったソースコード(例:この回答の2つのリンク)をコピーすることもできます。
しかし、私の考えはhttp://cvsweb.openbsd.org/cgi-bin/cvsweb/src/lib/libc/string/strlcpy.c?rev=1.11でのOpenBSDからstrlcpy
ソースではなくの長さを確認せずに基づいていますが、ここで元の文字列の長さを使用していないあなたの場合、最も効率的であるものに戻ってあなたの質問に行きますエンディング潜在的に非常に長いが、まだ適切であることも、元の文字列、「\ 0」:上
/*
* ANSI C version of strlcpy
* Based on the NetBSD strlcpy man page.
*
* Nathan Myers <[email protected]>, 2003/06/03
* Placed in the public domain.
*/
#include <stdlib.h> /* for size_t */
size_t
strlcpy(char *dst, const char *src, size_t size)
{
const size_t len = strlen(src);
if (size != 0) {
memcpy(dst, src, (len > size - 1) ? size - 1 : len);
dst[size - 1] = 0;
}
return len;
}
:
char *d = str; // the destination in your example
const char *s = string; // the source in your example
size_t n = max; // the max length in your example
/* Copy as many bytes as will fit */
if (n != 0) {
while (--n != 0) {
if ((*d++ = *s++) == '\0')
break;
}
}
/* Not enough room in dst, add NUL */
if (n == 0) {
if (max != 0)
*d = '\0'; /* NUL-terminate dst */
}
は、ここでのmemcpyを使用していますhttp://cantrip.org/strlcpy.c上strlcpyにのバージョンがあります私はより効率的だと思う私はソース文字列に依存します。非常に長いソース文字列の場合、strlenは時間がかかるかもしれません。元の長さを知る必要がなければ、最初の例がより速くなるかもしれません。
すべてはあなたのデータに依存しているので、実際のデータをプロファイリングするだけで見つけることができます。
出典
2016-06-26 06:10:49
rsp
ありがとうございました。すべての回答は素晴らしいです! –