0

我正在尝试类似 str = "stuff" + str; 之类的 java 等价物。

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

像 sprintf(str2, "stuff %s", str) 或 str2 = strcat("Stuff ", str);

4

2 回答 2

0

阅读文档。的正确形式strcat is

strcat(char* destination, const char* source);

这将附加sourcedestination. 你的方式是倒退的 - 因为"Stuff"是 a 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格式字符串时,它已被覆盖......)

我认为没有办法创建字符串的副本来做你想做的事情 - 预先添加一个字符串常量。有些语言只会宠坏你...

于 2013-10-27T01:27:14.907 回答
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。您没有问题,因为重新分配更大的内存块会产生一个新的未确定值。

于 2013-10-27T01:51:06.567 回答