如何将单个字符附加到 C 中的字符串?
IE
char* str = "blablabla";
char c = 'H';
str_append(str,c); /* blablablaH */
char* str = "blablabla";
您根本不应该修改此字符串。它驻留在实现定义的只读区域中。修改它会导致未定义的行为。
您需要一个 char 数组而不是字符串文字。
要将字符附加到 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
将输入字符串复制到新缓冲区中。最后,更改新缓冲区中的最后两个字节以添加要添加的字符以及尾随零。
如果您关心 Linux,则附加两个字符串的最简单方法是:
char * append(char * string1, char * string2)
{
char * result = NULL;
asprintf(&result, "%s%s", string1, string2);
return result;
}
这不适用于 MS Visual C。
注意:你必须free()
返回的内存asprintf()
我认为您不能在 c 中声明这样的字符串。您只能对 const char* 执行此操作,当然您不能修改 const char *,因为它是 const。
您可以使用动态 char 数组,但您必须注意重新分配。
编辑:实际上这个语法编译正确。如果它以您的方式初始化(来自字符串文字),您仍然不应该修改 str 指向的内容
原始海报并不是要写:
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;
}
创建一个新字符串(字符串+字符)
#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
数组非常有用。
我希望这有帮助。
C 本身没有字符串——你拥有的是一个 char 指针,指向一些包含字符“blablabla\0”的只读内存。为了在此处附加一个字符,您需要 a) 可写内存和 b) 为新形式的字符串提供足够的空间。字符串文字 "blablabla\0" 两者都没有。
解决方案是:
1)使用malloc()
等。动态分配内存。(之后不要忘记free()
。)
2)使用 char 数组。
使用字符串时,请考虑使用函数strn*
的变体str*
——它们将帮助您保持在内存范围内。
您可以strcat
在string.h
标准标头中使用,但不要将char
第二个参数作为第二个参数传递,而是使用以下代码
void append_str(char str[] , char c){
auto char arr[2] = {c , '\0'};
strcat(str , arr);
}
您可以使用 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);
}
就我而言,这是我找到的最佳解决方案:
snprintf(str, sizeof str, "%s%c", str, c);
就是这样,它 100% 有效
char* appending(char *cArr, const char c)
{
int len = strlen(cArr);
cArr[len + 1] = cArr[len];
cArr[len] = c;
return cArr;
}