54

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

IE

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

11 回答 11

41
char* str = "blablabla";     

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

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

好读:
char a[] = "string"; 有什么区别?和 char *p = "字符串";

于 2012-04-23T11:36:14.677 回答
41

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

这是一个示例:

#include <stdlib.h>

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

    size_t len = strlen(str);
   
    /* one for extra char, one for trailing zero */
    char *str2 = malloc(len + 1 + 1);

    strcpy(str2, str);
    str2[len] = c;
    str2[len + 1] = '\0';

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

    free(str2);
}

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

于 2012-04-23T11:46:23.140 回答
5

如果您关心 Linux,则附加两个字符串的最简单方法是:

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

这不适用于 MS Visual C。

注意:你必须free()返回的内存asprintf()

于 2013-05-09T01:41:18.293 回答
4

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

您可以使用动态 char 数组,但您必须注意重新分配。

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

于 2012-04-23T11:35:46.213 回答
4

原始海报并不是要写:

  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;
  }
于 2015-10-06T10:14:44.507 回答
3

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

#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数组非常有用。

我希望这有帮助。

于 2014-05-20T23:11:26.500 回答
2

C 本身没有字符串——你拥有的是一个 char 指针,指向一些包含字符“blablabla\0”的只读内存。为了在此处附加一个字符,您需要 a) 可写内存和 b) 为新形式的字符串提供足够的空间。字符串文字 "blablabla\0" 两者都没有。

解决方案是:

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

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

于 2012-04-23T11:47:31.653 回答
2

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

void append_str(char str[] , char c){
     auto char arr[2] = {c , '\0'};
     strcat(str , arr);
}
于 2021-06-03T11:30:25.797 回答
0

您可以使用 strncat()

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

int main(void){
  char hi[6];
  char ch = '!';
  strcpy(hi, "hello");

  strncat(hi, &ch, 1);
  printf("%s\n", hi);
}
于 2020-12-16T08:03:08.647 回答
-3

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

snprintf(str, sizeof str, "%s%c", str, c);
于 2016-06-23T03:29:59.503 回答
-4

就是这样,它 100% 有效

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

{

int len = strlen(cArr);

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

cArr[len] = c;

return cArr;


}
于 2013-01-31T12:48:34.100 回答