我想做类似这样的事情(显然不是有效的c代码):
char test[] = "you";
char new[] = "hey %s over there", test; // Want to get back "hey you over there"
这是我的方式,但似乎太复杂了。获取test和new的len,创建一个可以保存两个长度的新字符串缓冲区,连接new和test到字符串缓冲区。有更好的方法吗?
char hi[] = "hi"
vs char *hi = "hi"
。有什么区别?
答案 0 :(得分:2)
嗯,这是用C语言做的历史悠久的传统方式,虽然我认为你的意思是test
的长度和字符串文字,因为new
在你写之前没有长度数据进入它。
而且,顺便说一句,如果你曾期望你的代码将在C ++编译器中使用,请不要调用你的变量new
:-)虽然我是假设这只是一个快速而又脏的代码示例,因为new
对于变量来说不是一个好的描述性名称(newString
,或类似的东西,会更好)。
如果您可能会做很多事情,那么编写一个帮助您完成所有工作的辅助函数就没有问题。这可能会使您的代码看起来更干净,但我只是使用strcpy/strcat/strlen/sprintf
等来找到您当前的解决方案。
或者,您可以使用第三方代码,例如the better string library,许可证和管理态度允许(许可证是BSD / GPL,但管理层有时仍然存在问题)。
它的优势在于不会像一些第三方库那样拖延许多无关的功能。它只是字符串处理。
至于这两者之间的区别:
char hi[] = "hi";
char *hi = "hi";
第一个给你一个可修改的字符数组而后者没有(在两种情况下都尝试hi[0] = 'a';
,后者这样做是未定义的行为)。后者还允许您将hi
指针的值更改为指向其他位置。
答案 1 :(得分:2)
您可以使用sprintf功能。
int main(int ac, char** argv)
{
char test[] = "you";
char new[] = "hey %s over there";
char* total;
int len = strlen(test) + strlen(new) + 1;
total = malloc(len);
total[len - 1] = '\0';
sprintf(total, new, test);
printf(total);
free(total);
return 0;
}
答案 2 :(得分:1)
您可以使用snprintf
进行实际的字符串格式设置,但需要手动计算大小:
char newstring[19];
snprintf(newstring, 19, "hey %s over there", test);
请注意,如果要动态计算构成字符串长度,则不能真正拥有一个常量大小的数组(即除了某些实际常量之外,没有“常量表达式”可以代替19
)。要么接受C99的可变长度数组,要么分配动态内存:
char * newstring = malloc(computed_size_of_new_string);
另一种方法是分配一些大的静态缓冲区char newstring[2048];
,然后检查snprintf
的结果以查看是否发生了截断。
答案 3 :(得分:0)
不,这就是它在C中的工作方式。哦,不要忘记为终止'\0'
分配一个字节。
有许多库以更舒适的方式处理字符串。