有没有一个函数可以在不需要在C语言中创建两个不同的char数组的情况下追加到一个字符串的前面?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有没有一个函数可以在不需要在C语言中创建两个不同的char数组的情况下追加到一个字符串的前面?相关的知识,希望对你有一定的参考价值。

在C语言中,将字符串的尾部连接起来很容易。

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]){
    char str[15] = "new ";

    printf("old str = %s\n", str);
    strcat(str, "word");
    printf("new str = %s\n", str);
    return 0;
}

输出

old str = new
new str = new word

但是当我在一个数组的前面进行追加时,我会这样做:

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]){
    char str[15] = "word";
    char newStr[15] = "new ";

    printf("str = %s\n", str);
    strcat(newStr, str);
    printf("new str = %s\n", newStr);
    return 0;
}

输出

str = word
new str = new word

但是有没有一个函数可以让我在一行中追加到一个字符串的前面?更清楚的说,有没有一种方法可以在不需要创建两个不同的函数的情况下,将其追加到一个字符串的前面?char 数组?我只是觉得如果能这样做的话,我的代码看起来会干净很多。

半sudo代码的append函数

str = "word";
append(str, "new ");

当打印出来时,会有如下的输出。

str = word
new str = new word

这样的东西会让我的生活变得更轻松 因为我最近一直在处理很多文件输入的问题

谢谢

答案

你可以自己制作。

#include <stdio.h>
#include <string.h>

char  *strprepend(char str[], char const *prefix)
{
    size_t slen = strlen(str);
    size_t plen = strlen(prefix);
    memmove(str+plen,str,slen+1);
    memcpy(str,prefix,plen);
    return str;
}

int main(int argc, char *argv[]){
    char str[15] = "word";
    printf("str = '%s'\n", str);
    printf("new str= '%s'\n", strprepend(str,"new "));
    return 0;
}
/*
Output:

str = 'word'
new str= 'new word'

*/

如果你不想复制 strcat的不安全性,您也可以添加一个缓冲区大小检查。

另一答案

不,也许你应该看看 FreeBSD 内核的内部结构,看看他们是如何解决 TCPIP 堆栈的问题的。 由于他们需要有效地 (这意味着如果没有必要的话,不会进行字符串复制)构建数据包,并且他们必须在数据包的前面添加数据,因此他们分配了一些结构 (叫做 mbuf的,使用小的、预先分配的和有几种容量的)来建立完整的数据包。 它们也不是一开始就开始填充数据,而是在前面预留一些空间,以便以后知道要添加的数据量时再添加。 在linux中也是这样做的,所以这也是一个很好的起点。

顺便说一下,你最好解释一下你的具体问题......这样就可以评估你如何更好更有效地建立你的东西。 认为重新分配和复制数据是通常的坏习惯,它导致了低性能和低效率的代码。 最好的方法是考虑如何在开发东西的时候不需要移动大块的内存。

以上是关于有没有一个函数可以在不需要在C语言中创建两个不同的char数组的情况下追加到一个字符串的前面?的主要内容,如果未能解决你的问题,请参考以下文章

C语言中函数调用怎么返回两个值

c语言中strcmp的用法

Python 外部函数调用库ctypes简介

c语言问题,在源文件下编写了两个cpp文件,只能运行其中的一个,另外一个怎么运行呢?

为啥c ++ std::hash会创建一个仿函数结构并且可以在不每次创建结构的情况下调用它

C语言如何终止线程