将单个字符附加到C中的动态字符数组

时间:2014-07-11 21:07:53

标签: c character concatenation

如何将字符附加到char*? 所以......

char* thingy = "test";
char* another = "hello world";

thingy += another[6];

printf("%s\n", thingy);

我不想输出:

  

testw

但是,我得到了这个输出

  

在地址%p

编辑:

感谢您的帮助:)

4 个答案:

答案 0 :(得分:2)

C中没有字符串算术,所以你不能这样做。

然而,你可以使用strcat()(只要这些角色有空间):

char thingy[256] = "Hello World";

strcat(thingy, "!");

// thingy is now "Hello World!"

虽然重要的是要注意你应该总是检查字符串长度,并在做这些事情时要小心。

如果您想添加单个字符而不是字符串,可以将该字符复制到字符串中:

char thingy[256] = "Hello World";

char dummy[] = "#";

dummy[0] = '!';
strcat(thingy, dummy);

// thingy is now "Hello World!"

或者以手动方式进行:

char thingy[256] = "Hello World";

unsigned int len = strlen(thingy);

thingy[len] = '!';      // Append character
thingy[len + 1] = '\0'; // Readd termination

// thingy is now "Hello World!"

答案 1 :(得分:0)

thingy*的指针(char),即字符串"test"的第一个字符的地址。 thingy上的算术会更改它指向的地址:

thingy += another[6];

这会将地址char的{​​{1}}的整数值添加到another + 6指向的地址。这超出了字符串thingy的末尾,因而未定义的行为 - 只是您的程序具有字符串"test"

此外,"at address %p"指向的字符串是常量,因此您无法附加到它。您可以将其设为数组,例如thingy,然后执行char thingy[MAX_LENGTH_OF_THINGY] = "test";之类的操作(注意需要NUL终止C字符串)。或者你可以完全创建一个新的字符串,例如thingy[4] = another[6]; thingy[5] = '\0';足够的内存并将原始+附加字符复制到其中。

答案 2 :(得分:0)

在这种情况下,您唯一的选择是重新分配char *的内存,以便您可以获得更大的字符串。

首先,你需要原始字符串的长度,然后必须加1,因为strlen函数不包含空终止符:

char* thingy = "test";
char* another = "hello world";

int len = strlen(thingy);
char* thingy = realloc(thingy, (len + 2) * sizeof(char));
thingy[len] = another[6];
thingy[len +1] = '\0';

printf("%s\n", thingy);

但是,如果您有权访问C ++,更好的方法是使用std :: string对象:

std::string thingy = "test";
std::string another = "hello world";

thingy += another[6];
printf("%s\n", thingy.c_str());

由于字符串是容器,因此有很多方法可以解决问题:

thingy.push_back(another[6]);

thingy.append(another, 6, 1);

thingy.insert(thingy.end(), another[6]);

std字符串的另一个好处是它们可以为你处理空终止符,所以你不必担心它。

答案 3 :(得分:-1)

您追加的字符串不应该是文字。如果你有:

char thingy[10] = "test";

你可以:

int len = strlen(thingy);
thingy[len] = another[6];
thingy[len+1] = '\0';