在C中追加字符串到字符串?

时间:2012-04-23 11:33:52

标签: c string

如何将单个字符附加到C?

中的字符串

char* str = "blablabla";
char c = 'H';
str_append(str,c); /* blablablaH */

12 个答案:

答案 0 :(得分:33)

要将字符串附加到C中的字符串,首先必须确保包含字符串的内存缓冲区足够大以容纳额外字符。在您的示例程序中,您必须分配一个新的附加内存块,因为无法修改给定的文字字符串。

以下是一个示例:

#include <stdlib.h>

int main()
{
    char *str = "blablabla";
    char c = 'H';

    size_t len = strlen(str);
    char *str2 = malloc(len + 1 + 1 ); /* one for extra char, one for trailing zero */
    strcpy(str2, str);
    str2[len] = c;
    str2[len + 1] = '\0';

    printf( "%s\n", str2 ); /* prints "blablablaH" */

    free( str2 );
}

首先,使用malloc分配一个新的内存块,它足以容纳输入字符串的所有字符,附加的额外字符 - 以及最后的零。然后调用strcpy将输入字符串复制到新缓冲区中。最后,更改新缓冲区中的最后两个字节以添加要添加的字符以及尾随零。

答案 1 :(得分:29)

char* str = "blablabla";     

您根本不应修改此字符串。它驻留在实现定义的只读区域中。修改它会导致未定义的行为

您需要一个char数组而不是字符串文字。

好读:
What is the difference between char a[] = "string"; and char *p = "string";

答案 2 :(得分:4)

我认为你不能在c中声明一个类似的字符串。您可能只对const char *执行此操作,当然您不能修改const char *,因为它是const。

您可以使用动态字符数组,但您必须负责重新分配。

编辑:实际上这个语法编译正确。如果它以你的方式初始化(​​从字符串文字),你仍然不应该修改str指向的内容

答案 3 :(得分:3)

附加两个字符串的最简单方法:

char * append(char * string1, char * string2)
{
    char * result = NULL;
    asprintf(&result, "%s%s", string1, string2);
    return result;
}

答案 4 :(得分:2)

创建一个新字符串(string + char)

#include <stdio.h>    
#include <stdlib.h>

#define ERR_MESSAGE__NO_MEM "Not enough memory!"
#define allocator(element, type) _allocator(element, sizeof(type))

/** Allocator function (safe alloc) */
void *_allocator(size_t element, size_t typeSize)
{
    void *ptr = NULL;
    /* check alloc */
    if( (ptr = calloc(element, typeSize)) == NULL)
    {printf(ERR_MESSAGE__NO_MEM); exit(1);}
    /* return pointer */
    return ptr;
}

/** Append function (safe mode) */
char *append(const char *input, const char c)
{
    char *newString, *ptr;

    /* alloc */
    newString = allocator((strlen(input) + 2), char);
    /* Copy old string in new (with pointer) */
    ptr = newString;
    for(; *input; input++) {*ptr = *input; ptr++;}
    /* Copy char at end */
    *ptr = c;
    /* return new string (for dealloc use free().) */
    return newString;
}

/** Program main */
int main (int argc, const char *argv[])
{
    char *input = "Ciao Mondo"; // i am italian :), this is "Hello World"
    char c = '!';
    char *newString;

    newString = append(input, c);
    printf("%s\n",newString);
    /* dealloc */
    free(newString);
    newString = NULL;

    exit(0);
}

              0   1   2   3    4    5   6   7   8   9  10   11
newString is [C] [i] [a] [o] [\32] [M] [o] [n] [d] [o] [!] [\0]

在不知道其确切大小的情况下,请勿更改数组大小([len +1]等),否则可能会损坏其他数据。 alloc一个具有新大小的数组并将旧数据放入其中,请记住,对于char数组,最后一个值必须为\0; calloc()将所有值设置为\0,这对于char数组非常有用。

我希望这会有所帮助。

答案 5 :(得分:2)

原创海报不是故意写的:

  char* str = "blablabla";

  char str[128] = "blablabla";

现在,添加单个字符似乎比使用strcat添加整个字符串更有效。 走strcat的方式,你可以:

  char tmpstr[2];
  tmpstr[0] = c;
  tmpstr[1] = 0;
  strcat (str, tmpstr);

但你也可以轻松编写自己的函数(正如我之前已经完成的那样):

  void strcat_c (char *str, char c)
  {
    for (;*str;str++); // note the terminating semicolon here. 
    *str++ = c; 
    *str++ = 0;
  }

答案 6 :(得分:1)

C本身没有字符串 - 你所拥有的是一个指向包含字符“blablabla \ 0”的只读内存的字符指针。为了在那里附加一个字符,你需要a)可写内存和b)新形式的字符串的足够空间。字符串文字“blablabla \ 0”既没有。

解决方案是:

1)使用malloc()等。动态分配内存。 (之后不要忘记free()。)
2)使用char数组。

使用字符串时,请考虑使用strn*函数的str*变体 - 它们将帮助您保持在内存范围内。

答案 7 :(得分:1)

您可以在 strcat 标准标头中使用 string.h 但不要传递 char 作为第二个参数,而是使用以下代码

void append_str(char str[] , char c){
     auto char arr[2] = {c , '\0'};
     strcat(str , arr);
}

答案 8 :(得分:0)

您可以使用strncat()

// Getting file from local directory and load
extension ViewController: ARSCNViewDelegate {

   func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
       guard !(anchor is ARPlaneAnchor) else { return }
       if let droneNode = loadModel() {
           DispatchQueue.main.async {
               node.addChildNode(droneNode)
           }
       }
   }

   func getDocumentsDirectory() -> URL {
       let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
       let documentsDirectory = paths[0]
       return documentsDirectory

   }

   // Loads The SCNFile From The Documents Directory
   func loadModel() -> SCNNode? {
       //1. Get The Path Of The Downloaded File
       let downloadedScenePath = getDocumentsDirectory().appendingPathComponent("table.obj")
       let asset = MDLAsset(url: downloadedScenePath)
       let object = asset.object(at: 0)
       let node = SCNNode(mdlObject: object)
       //7. Add It To The Scene
       return node

    }
}

答案 9 :(得分:-1)

就我而言,这是我找到的最佳解决方案:

snprintf(str, sizeof str, "%s%c", str, c);

答案 10 :(得分:-2)

就是这样,它可以100%

char* appending(char *cArr, const char c)

{

int len = strlen(cArr);

cArr[len + 1] = cArr[len];

cArr[len] = c;

return cArr;


}

答案 11 :(得分:-5)

在C ++中,您只需通过以下方式将char添加到string

int main()
{
   std::string s = "Hello there";
   char c = '?';
   s = s+c;
   std::cout << s << std::endl;
   return 0;
}