Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 创建包含以前声明的字符串变量的新字符串_C - Fatal编程技术网

C 创建包含以前声明的字符串变量的新字符串

C 创建包含以前声明的字符串变量的新字符串,c,C,我想做一些类似这样的事情(虽然显然不是有效的c代码): 这是我的方式,但它似乎太复杂了。获取test和new的len,创建一个可以容纳这两个长度的新字符串缓冲区,将new和test连接到字符串缓冲区。有更好的方法吗 还有char hi[]=“hi”vschar*hi=“hi”。有什么区别吗?不,这就是它在C中的工作原理。哦,别忘了为终止的'\0'分配一个字节 不过,有很多库以更舒适的方式处理字符串。不,这就是它在C中的工作方式。哦,别忘了为终止的'\0'分配一个字节 不过,有很多库以更舒适的方式

我想做一些类似这样的事情(虽然显然不是有效的c代码):

这是我的方式,但它似乎太复杂了。获取test和new的len,创建一个可以容纳这两个长度的新字符串缓冲区,将new和test连接到字符串缓冲区。有更好的方法吗


还有
char hi[]=“hi”
vs
char*hi=“hi”
。有什么区别吗?

不,这就是它在C中的工作原理。哦,别忘了为终止的
'\0'
分配一个字节


不过,有很多库以更舒适的方式处理字符串。

不,这就是它在C中的工作方式。哦,别忘了为终止的
'\0'
分配一个字节


不过,有很多库以更舒适的方式处理字符串。

您可以使用
snprintf
进行实际的字符串格式化,但需要手动计算大小:

char newstring[19];
snprintf(newstring, 19, "hey %s over there", test);
请注意,如果要动态计算组成字符串的长度,就不能真正拥有一个常量大小的数组(即,除了一些实际常量之外,没有“常量表达式”可以代替
19
)。要么接受C99的可变长度数组,要么分配动态内存:

char * newstring = malloc(computed_size_of_new_string);

另一种选择是分配一些大的静态缓冲区,
charnewstring[2048]
,然后检查
snprintf
的结果以查看是否发生截断。

您可以使用
snprintf
进行实际的字符串格式化,但需要手动计算大小:

char newstring[19];
snprintf(newstring, 19, "hey %s over there", test);
请注意,如果要动态计算组成字符串的长度,就不能真正拥有一个常量大小的数组(即,除了一些实际常量之外,没有“常量表达式”可以代替
19
)。要么接受C99的可变长度数组,要么分配动态内存:

char * newstring = malloc(computed_size_of_new_string);

另一种选择是分配一些大的静态缓冲区,
charnewstring[2048],然后检查
snprintf
的结果以查看是否发生了截断。

好吧,这是在C中进行此操作的由来已久的传统方法,尽管我认为您指的是
test
的长度,而字符串literal,因为
new
直到您将数据写入其中后才有长度

另外,如果你希望你的代码将在C++编译器中使用,请不要调用变量<代码>新< /代码>:-尽管我假设这只是一个快速和肮脏的代码示例,因为<代码>新< /COD>无论如何都不是一个好的描述性名称(<代码> NexSoist<代码>,或类似的,更好)。

如果您可能经常这样做,那么编写一个帮助器函数为您完成所有的繁重工作是没有问题的。这可能会使您的代码看起来更干净,但我只想使用
strcpy/strcat/strlen/sprintf
等工具选择您当前的解决方案

或者,您可以使用第三方代码,如许可证和管理态度许可(许可证是BSD/GPL,但有时管理仍然可能是一个问题)

它的优点是不会像某些第三方库惯常做的那样拖入大量无关的功能。它所做的只是字符串处理


关于这两者的区别:

char hi[] = "hi";
char *hi = "hi";

第一个为您提供了一个可修改的字符数组,而第二个则不提供(请尝试
hi[0]='a';
在这两种情况下,使用后者执行此操作将是未定义的行为)。后者还允许您将
hi
指针的值更改为指向其他地方。

好吧,这是在C中执行此操作的由来已久的传统方法,尽管我认为您指的是
test
的长度,而字符串文本,因为
new
在将数据写入它之前没有长度

另外,如果你希望你的代码将在C++编译器中使用,请不要调用变量<代码>新< /代码>:-尽管我假设这只是一个快速和肮脏的代码示例,因为<代码>新< /COD>无论如何都不是一个好的描述性名称(<代码> NexSoist<代码>,或类似的,更好)。

如果您可能经常这样做,那么编写一个帮助器函数为您完成所有的繁重工作是没有问题的。这可能会使您的代码看起来更干净,但我只想使用
strcpy/strcat/strlen/sprintf
等工具选择您当前的解决方案

或者,您可以使用第三方代码,如许可证和管理态度许可(许可证是BSD/GPL,但有时管理仍然可能是一个问题)

它的优点是不会像某些第三方库惯常做的那样拖入大量无关的功能。它所做的只是字符串处理


关于这两者的区别:

char hi[] = "hi";
char *hi = "hi";

第一个为您提供了一个可修改的字符数组,而第二个则不提供(请尝试
hi[0]='a';
在这两种情况下,使用后者执行此操作将是未定义的行为)。后者还允许您将
hi
指针的值更改为指向其他地方。

您可以使用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;
}

您可以使用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;
}