反向strcat

时间:2009-11-04 07:04:02

标签: c string

我知道strcat(dest, src)src追加到dest,然后返回dest。 现在,如果我想将dest追加到src - 即在srcdest之前插入字符串dest - 是否有办法做到这一点?

我尝试使用类似

strcat
dest = strcat(dest, src);

但无法使其发挥作用。

2 个答案:

答案 0 :(得分:5)

如果您想在不修改src的情况下执行此操作,则可以分两步完成:

strcpy(temp, src);
strcat(temp, dest);

为了清楚起见,省略了所有错误处理以及temp足够大的确定。

答案 1 :(得分:4)

这是一个经过轻度测试的strlprecat()实现,它或多或少遵循OpenBSD的'strlxxx()'函数风格:

  • 传递目标缓冲区的长度,
  • 始终终止生成的字符串(如果缓冲区大小大于0)和
  • 返回所需缓冲区的长度(不包括终结符)

因此,此函数永远不会导致缓冲区溢出,但可能会导致截断的字符串(因此会破坏缓冲区中的原始字符串)。

无论如何,我发现一个类似的功能偶尔会有用:

size_t
strlprecat( char* dst, const char * src, size_t size)
{
    size_t dstlen = strnlen( dst, size);
    size_t srclen = strlen( src);
    size_t srcChars = srclen;
    size_t dstChars = dstlen;

    if (0 == size) {
        /* we can't write anything into the dst buffer */
        /*  -- bail out                                */

        return( srclen + dstlen);
    }

    /* determine how much space we need to add to front of dst */

    if (srcChars >= size) {
        /* we can't even fit all of src into dst */
         srcChars = size - 1;
    }

    /* now figure out how many of dst's characters will fit in the remaining buffer */
    if ((srcChars + dstChars) >= size) {
        dstChars = size - srcChars - 1;
    }

    /* move dst to new location, truncating if necessary */
    memmove( dst+srcChars, dst, dstChars);

    /* copy src into the spot we just made for it */
    memcpy( dst, src, srcChars);

    /* make sure the whole thing is terminated properly */
    dst[srcChars + dstChars] = '\0';

    return( srclen + dstlen);
}

随意捣乱,这样它就不会处理缓冲区长度(盲目地将内容移动到所需的位置),或者只是在缓冲区不够大的情况下只返回错误而不做任何事情。

哦,如果你修复了任何错误,当然可以发表评论。