从C中的变量构建字符串

我正在研究一个使用套接字的简单的二十一点游戏,由我的操作系统类提供。 我们得到了一个套接字接口,它已经来回传递一个字符数组。

希望我能做到这样的事情:

char[] msgOut = printf("Dealer's Card is %C %C", char1, char2); sendMsg(msgOut); 

然而 ,谷歌搜索引导我确定printf的返回值是Char的输出数量的int, 而不是 chars本身的char [](正如我所希望的那样)。

是否有另一个C函数可以让我从变量中构建字符串?

printf写入标准输出。 snprintf完成了你的目标。 在调用snprintf之后,插值字符串存储在’buffer’中。 您可能希望更智能地定义缓冲区大小,但这只是一个示例。

 char buffer[1024]; snprintf(buffer, sizeof(buffer), "Dealer's Card is %C %C", char1, char2); 

Glibc(以及其他几个C库)具有asprintf的便利function。

 char *msgOut; asprintf(&msgOut, "Dealer's Card is %C %C", char1, char2); sendMsg(msgOut); free(msgOut); 

当您没有对保存字符串所需的内存量进行良好的预先预测时,这非常有用。 (如果这样做, snprintf开销较小,因为它不会动态分配内存。)

在没有asprintf但具有符合标准的snprintf ,可以通过两次调用snprintf来实现 – 首先没有缓冲区和零大小来确定字符串长度,介入malloc ,然后第二次使用新分配的空间。

如果你想在c中动态分配内存的字符串生成器,我发现http://linux.die.net/man/3/vasprintf很有用。

例:

 #include  int i; printf("//Simple dynamic string builder:\n"); char *strs[6] = {"I","am","an","array","of","strings"}; char *buf = "["; // open bracket for (i=0;i<6;i++) { // Dynamically build and allocate memory asprintf(&buf,"%s%s",buf,strs[i]); if(i!=5) { // Add a comma , after each but skip the last asprintf(&buf,"%s,",buf); } } asprintf(&buf,"%s]",buf); // closing backet printf("\"%s\"\n",buf); 

输出是

 //Simple string builder: "[I,am,an,array,of,strings]" 

所以char *bufasprintf动态扩展,并通过将自身格式化为asprintf语句来构建。