如何将单个字符附加到C?
中的字符串即
char* str = "blablabla";
char c = 'H';
str_append(str,c); /* blablablaH */
答案 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;
}