创建一个包含先前声明的字符串var的新字符串

时间:2012-03-11 23:46:59

标签: c

我想做类似这样的事情(显然不是有效的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"。有什么区别?

4 个答案:

答案 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'分配一个字节。

有许多库以更舒适的方式处理字符串。