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

C 是否有任何函数可以将字符作为前缀添加到字符串中并存储在同一字符串中?,c,concatenation,operators,c-strings,string-concatenation,C,Concatenation,Operators,C Strings,String Concatenation,如何在c中执行以下操作? s=“#”+s; 其中s是一个字符串 我尝试过使用strncat(),但在连接后,答案应该存储在带有前缀“#”的s中。假设s有足够的元素,您可以通过以下方式将一个字符的前缀添加到s: 将现有字符串逐孔滑动(不能使用strcpy()或memcpy(),因为它们不支持复制到重叠区域) 写入要添加到s的第一个元素的字符 #包括 #包括 int add_前缀(char*str、char c、size_t bufsz){ 尺寸标准=标准长度(str)+1; if(bufsz对于初

如何在c中执行以下操作? s=“#”+s; 其中s是一个字符串


我尝试过使用strncat(),但在连接后,答案应该存储在带有前缀“#”的s中。

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

  • 将现有字符串逐孔滑动(不能使用
    strcpy()
    memcpy()
    ,因为它们不支持复制到重叠区域)
  • 写入要添加到
    s
    的第一个元素的字符
  • #包括
    #包括
    int add_前缀(char*str、char c、size_t bufsz){
    尺寸标准=标准长度(str)+1;
    
    if(bufsz对于初学者,存储源字符串的字符数组应该足够大,以便能够追加一个以上的字符

    这是一个演示程序

    #include <stdio.h>
    #include <string.h>
    
    int main( void )
    {
        char s[7] = "Hello";
    
        memmove( s + 1, s, strlen( s ) + 1 );
        s[0] = '#';
    
        puts( s );
    }
    
    更一般的方法如下所示

    #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, "#" ) );
    }
    
    #包括
    #包括
    字符*附加前缀(字符s[],常量字符*前缀)
    {
    大小=strlen(前缀);
    如果(n!=0)
    {
    memmove(s+n,s,strlen(s)+1);
    memcpy(s,前缀,n);
    }
    返回s;
    }
    内部主(空)
    {
    char s[7]=“你好”;
    puts(附加前缀“#”);
    }
    

    使用函数
    append\u prefix
    可以将任何字符串追加到另一个字符串之前,前提是结果字符数组有足够的空间。

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

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

    在这种情况下,它只是像:

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

    其中“足够大”可以是像
    2+strlen(s)

    这样的东西,你实际上想要的是前缀还是后缀?在字符串s
    #前面加上字符“#”,定义足够大的640/*640应该足够任何用途:)*/
    @pmg:。请阅读。
    #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, "#" ) );
    }
    
    char s[] = "hello";
    char new_s [LARGE_ENOUGH] = "#";
    strcat(new_s, s);