在C中连接字符串

时间:2013-10-27 01:24:25

标签: c string concatenation

我正在尝试像这样的java等价物 str =“stuff”+ str;

我尝试使用sprintf(str,“stuff%s”,str);和str = strcat(“Stuff”,str); 这些都不起作用......我是否被迫使用第二个字符串来保存结果?

类似sprintf(str2,“stuff%s”,str)或str2 = strcat(“Stuff”,str);

2 个答案:

答案 0 :(得分:0)

阅读文档。 strcat is

的正确格式
strcat(char* destination, const char* source);

会将source追加到destination。你的方式是倒退 - 由于"Stuff"const char*,它会失败。

strcat(str, "Stuff");

应该有效,导致str包含原始字符串,然后是Stuff

示例:

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

int main(void) {
  char string[256];
  char s2[256];
  strcpy(string, "hello ");
  strcat(string, "world");
  printf("The concatenated string is '%s'\n", string);
  sprintf(string, "I say %s", string);
  printf("The new string is '%s\n'", string);
  strcpy(string, "hello world");
  sprintf(s2, "I say %s", string);
  printf("And now it is '%s'\n", s2);
}

结果

The concatenated string is 'hello world'
The new string is 'I say I say world
'And now it is 'I say hello world'

正如您所看到的,您需要将sprintf的结果放在不同的字符串中,否则会覆盖(当编译器将string读入格式字符串时,它会覆盖它已被覆盖......)

我认为没有办法创建字符串的副本来完成你的工作 - 预先设置字符串常量。有些语言会让你失望......

答案 1 :(得分:0)

实际上最好使用第二个字符串。

但是,如果你真的不想这样,你肯定有足够的分配空间进入你的变量。然后你可以做以下

strncpy(memmove(str + 6, str, strlen(str) + 1) - 6, "stuff ", 6); //+ 1 to copy the null character

或者

memmove(str + 6, str, strlen(str) + 1);
strncpy(str, "stuff ", 6);

即使此解决方案有效,我也不建议您使用它。它的可读性较差,而且 - 我认为 - 较慢。

如果您正在使用malloc并需要realloc。你没有问题,因为重新分配更大的内存块会产生一个新的未确定值。