我正在研究一个使用套接字的简单的二十一点游戏,这是我的操作系统类的礼貌。 我们给了一个socket接口,它已经来回传递一个字符数组。
我希望我可以做这样的事情:
char[] msgOut = printf("Dealer's Card is %C %C", char1, char2);
sendMsg(msgOut);
HOWEVER ,谷歌搜索引导我确定printf的返回值是Char的输出数量的int,不 chars本身的char []正如我所希望的那样。)
是否有另一个C函数可以让我从变量中构建字符串?
答案 0 :(得分:27)
printf
写入标准输出。 snprintf
完成了你的目标。在调用snprintf之后,插值字符串存储在“缓冲区”中。您可能希望更智能地定义缓冲区大小,但这只是一个示例。
char buffer[1024];
snprintf(buffer, sizeof(buffer), "Dealer's Card is %C %C", char1, char2);
答案 1 :(得分:8)
Glibc(以及其他几个C库)具有便捷功能asprintf
。
char *msgOut;
asprintf(&msgOut, "Dealer's Card is %C %C", char1, char2);
sendMsg(msgOut);
free(msgOut);
当您对保持字符串所需的内存量没有很好的预测时,这非常有用。 (如果这样做,snprintf
的开销较小,因为它不会动态分配内存。)
在没有asprintf
但符合标准的snprintf
的系统上,它可以通过两次调用snprintf
来实现 - 首先没有缓冲区和零大小来确定字符串长度,干预malloc
,然后第二次使用新分配的空间。
答案 2 :(得分:0)
如果你想在c中动态分配内存的字符串生成器,我发现http://linux.die.net/man/3/vasprintf是有用的。
示例:
#include <stdio.h>
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
语句来构建。