strlmove与strmove在C中有什么优势?

时间:2008-11-04 05:15:33

标签: c

修剪我们使用strmove的前导空格。但我们被建议使用strlmove而不是strmove。我已经阅读并使用了strlcpy和strlcat。 strlmove是否具有类似的功能以及它的优点是什么?

编辑1:谢谢Mike B和Chris Young。这就是我们使用strlcpy的方式。

size_t strlcpy(char *dst, const char *src, size_t size)
{
    strncpy(dst, src, size - 1);
    dst[size - 1] = '\0';
    return(strlen(src));
}

所以我只是想以同样的方式使用strlmove()。我想确认是否有关于strlmove()实现的规范。我知道这是我能问的最好的地方之一。

编辑2:使用memmove()以与strlcpy()和strlcat()相同的方式实现strlmove()。

size_t strlmove(char *dst, const char *src, size_t size)
{
    //Error if the size is 0
    //If src length is greater than size; 
    //   memmove(dst, src, size-1) and dst[size] = \0;
    //Otherwise
    //   memmove(dst, src, length(src));
    return source len;
}

感谢所提供的帮助和支持。

谢谢, Mathew Liju

5 个答案:

答案 0 :(得分:4)

strmove,strlmove,strlcpy,strlcat都是不是标准C函数,所以我不知道他们做什么而不知道你正在使用哪个特定的非标准库。标准C提供strcpy,strcat,strncat,strncpy,memmove,memcpy等。

如果您不知道源字符串是否适合目标缓冲区,那么使用strncpy over strcpy是安全的。但是,strncpy有一个主要的性能问题,因为它始终写入为该大小指定的字节数。那就是:

char buf[4096];
strncpy(buf, "Hello", sizeof buf);

将写'H','e','l','l','o'并用'\ 0'填充剩余的4091字节的buf。使用strncpy需要注意的另一件事是,如果size参数小于源字符串长度加上null,则不会对字符串进行空终止。例如:

char buf[5];
strncpy(buf, "Hello", sizeof buf);

将'H','e','l','l','o'写入buf并且不会以空值终止。

答案 1 :(得分:2)

作为Chris Young mentions,这些例程不是标准的(或者就我所知的广泛使用而言),所以我不能100%确定具体细节,但是:

strl()例程的str()变体通常会使用一个额外的参数来指示目标缓冲区的大小。该例程保证它不会将数据写入缓冲区的末尾(因为它知道大小)。通常strl()函数也会保证它们会在字符串的末尾或缓冲区的末尾放置一个终止空字符(可能会截断在那里创建的任何字符串),这样你也可以保证有一个终止字符串通常可以传递给其他str()函数。请注意,如果缓冲区的长度指定为0(零),则函数将放置一个终止空字符(因为缓冲区中没有任何空间)。

在我看来,使用strl()(或strn())函数优先于相应的str()例程以防止缓冲区溢出几乎总是更好。

答案 2 :(得分:1)

快速谷歌搜索显示strlmove功能的唯一提及是在stackoverflow :)。所以它可能不是很常见的功能 但是,如果我们假设此函数本质上接近strlcpy,则此函数与strmove的不同之处在于使用size参数移动有限的字节数并且使目标字符串NULL终止

答案 3 :(得分:0)

至少在Theo de Raadt的版本中,strncpy和strlcpy之间有一个很大的区别,你在实现中错过了。如果给定字符串的长度小于缓冲区大小,则strncpy用空字节填充缓冲区的其余部分。在许多情况下,这可能只是一个微小的差异,但由于许多c程序员倾向于使用额外的大缓冲区在安全站点上,它可以有所作为。


strncpy(buffer, "bla", 1024);

将1021'\ 0'写入缓冲区,尽管一个就足够了。 strlcpy只写一个'\ 0'。

答案 4 :(得分:0)

正如克里斯所说,你目前使用的功能都是非标准功能。 ......更糟糕的是,他们仍然效率很低,而且仍然容易出错。您可以轻松地创建一些使用memcpy / memmove和take(char *)的API,它们可以在任何地方工作,并且可能比非std更快。您目前使用的各种变种。

然而,如果你想让别人做繁重的工作,并免费获得安全性/可用性,你可以看一下像ustr这样的东西......这很容易整合,是std。 C,安全,快速,并且可以处理常量/自动/ utf8 /动态字符串。还有其他选择。