代码之家  ›  专栏  ›  技术社区  ›  Liju Mathew

C中strlmove与strmove的优势是什么?

c
  •  0
  • Liju Mathew  · 技术社区  · 16 年前

    为了修剪前导空格,我们使用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:strlmove()的实现方式与strlcpy()和strlcat()使用memmove()的方式相同。

    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;
    }
    

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

    谢谢, 马修·李菊

    5 回复  |  直到 16 年前
        1
  •  4
  •   Chris Young    16 年前

    strmove,strlmove,strcpy,strcat都是 标准C函数,所以如果不知道您使用的是哪个特定的非标准库,我就无法评论它们的作用。标准C提供strcpy、strcat、strncat、strncpy、memmove、memcpy等。

    如果您不知道源字符串是否适合目标缓冲区,为了安全起见,使用strncpy而不是strcpy是有意义的。然而,strncpy有一个主要的性能问题,因为它 总是 写入为大小指定的字节数。即:

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

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

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

    将把'H'、'e'、'l'、'1'、'o'写入buf,并且它不会以null结尾。

        2
  •  2
  •   Community CDub    8 年前

    Chris Young mentions ,这些例程不是标准的(或者据我所知,在广泛、常用的情况下),所以我不能100%确定更多的细节,但是:

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

    在我看来,使用 strl() (或 strn() )优先于相应的功能 str() 防止缓冲区溢出的例程。

        3
  •  1
  •   Ilya    16 年前

    快速的谷歌搜索显示,strlmove函数唯一被提及的是stackovoverflow:)。所以它可能不是很常见的功能。
    但如果我们假设这个函数本质上接近 strlcpy ,此功能与 strmove 通过使用size参数来移动有限数量的字节,以及 使目标字符串以NULL结尾 .

        4
  •  0
  •   quinmars    16 年前

    strncpy和strlcpy之间有一个很大的区别,至少在Theo de Raadt的版本中是这样,你在实现中错过了这个区别。如果给定字符串的长度小于缓冲区大小,则strncpy会用空字节填充缓冲区的其余部分。在许多情况下,这可能只是一个微小的差异,但由于许多c程序员倾向于使用超大缓冲区来确保安全,这可能会产生影响。

    
    strncpy(buffer, "bla", 1024);
    

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

        5
  •  0
  •   James Antill    16 年前

    正如Chris所说,您当前使用的功能是非td的。..更糟糕的是,它们仍然非常低效,仍然容易出错。您可以轻松创建几个使用memcpy/memmove和take(char*)的API,这些API可以在任何地方工作,并且可能比您当前使用的非td.变体更快。

    然而,如果你想让别人来做这项繁重的工作,并免费获得安全性/可用性,你可以看看这样的东西 ustr …它易于集成,是std.C,安全、快速,可以处理常量/自动/utf8/动态字符串。还有其他选择。