我正在尝试类似 str = "stuff" + str; 之类的 java 等价物。
我尝试使用 sprintf(str, "stuff %s", str); 和 str = strcat("Stuff", str); 这些都不起作用......我是否被迫使用第二个字符串来保存结果?
像 sprintf(str2, "stuff %s", str) 或 str2 = strcat("Stuff ", str);
我正在尝试类似 str = "stuff" + str; 之类的 java 等价物。
我尝试使用 sprintf(str, "stuff %s", str); 和 str = strcat("Stuff", str); 这些都不起作用......我是否被迫使用第二个字符串来保存结果?
像 sprintf(str2, "stuff %s", str) 或 str2 = strcat("Stuff ", str);
阅读文档。的正确形式strcat is
strcat(char* destination, const char* source);
这将附加source
到destination
. 你的方式是倒退的 - 因为"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
格式字符串时,它已被覆盖......)
我认为没有办法创建字符串的副本来做你想做的事情 - 预先添加一个字符串常量。有些语言只会宠坏你...
实际上最好使用第二个字符串。
但是,如果您真的不想这样做,并且您肯定会在变量中分配足够的空间。然后您可以执行以下操作
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。您没有问题,因为重新分配更大的内存块会产生一个新的未确定值。