从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 *buf
由asprintf
动态扩展,并通过将自身格式化为asprintf
语句来构建。