是否有任何函数可以将字符作为字符串前缀并存储在同一字符串中?

Is there any function for prefixing a character to a string and store in the same string?

我们如何在c中进行以下操作? 小号=“#”+小号; 其中 s 是一个字符串 .

我试过使用 strncat() 但在连接后答案应该存储在前缀为“#.

的 s 中

假设s有足够的元素,你可以通过以下方式给s添加一个字符的前缀:

  1. 通过 memmove() 将现有字符串滑动一位(您不能使用 strcpy()memcpy(),因为它们不支持复制到重叠区域)
  2. 写入要添加到 s 的第一个元素的字符。
#include <stdio.h>
#include <string.h>

int add_prefix(char* str, char c, size_t bufsz) {
    size_t strsize = strlen(str) + 1;

    if (bufsz <= strsize) {
        return -1;
    }

    memmove(str + 1, str, strsize); /* +1 for terminating null-character */
    str[0] = c;
    return 0;
}

int main(void) {
    char s[128] = "hello";

    printf("before add_prefix() : %s\n", s);

    add_prefix(s, '#', sizeof(s));
    printf("after  add_prefix() : %s\n", s);

    return 0;
}

对于初学者来说,存储源字符串的字符数组应该足够大,以便能够再追加一个字符。

这是一个演示程序。

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

int main( void )
{
    char s[7] = "Hello";

    memmove( s + 1, s, strlen( s ) + 1 );
    s[0] = '#';

    puts( s );
}

程序输出为

#Hello

更通用的方法如下所示

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

char * append_prefix( char s[], const char *prefix )
{
    size_t n = strlen( prefix );

    if (n != 0)
    {
        memmove( s + n, s, strlen( s ) + 1 );
        memcpy( s, prefix, n );
    }

    return s;
}

int main( void )
{
    char s[7] = "Hello";

    puts( append_prefix( s, "#" ) );
}

使用函数 append_prefix 您可以将任何字符串追加到另一个字符串之前,前提是结果字符数组有足够的 space.

种类取决于应用程序。如果您正在编写一些字符串库、一些搜索算法或其他性能关键的东西,那么您可以 fiddle 和 memmove 一起使用,如其他答案所示,或者更可能是一些自定义的、基于对齐的算法。

但是除非您有如此极端的 RAM 使用或性能要求,否则您可能应该将所有字符串视为“不可变”(基本上是只读的)并创建一个新字符串。对于普通的 C 应用程序来说,这已经“足够好”了。

在这种情况下,它就像这样:

char s[] = "hello";
char new_s [LARGE_ENOUGH] = "#";
strcat(new_s, s);

其中“LARGE_ENOUGH”可能类似于 2 + strlen(s)