2011-02-03 78 views
13

我正在使用套接字,我的操作系统类提供的一款裸骨酒杯游戏。 我们已经有了一个socket接口,它可以来回传递字符数组。C中的变量构建字符串

希望我可以做这样的事情:

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

无论其,谷歌搜索使我确定的printf的返回值是字符的输出数一个int,字符的字符[]本身(正如我所希望的)。

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

回答

23

printf写入标准输出。 snprintf完成你要去的地方。插入的字符串在调用snprintf后存储在“缓冲区”中。您可能希望更加智能地定义您的缓冲区大小,但这仅仅是一个示例。

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

不,请看例子。缓冲区将被修改。 C中的许多函数返回错误代码并修改它们的参数。你必须习惯C中的这个编写代码。 – 2011-02-03 01:53:24

+0

是的。我眼中的短视。在撰写评论后,我重新回顾了你的回答。 – 2011-02-03 01:54:25

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,然后第二次使用新分配的空间。

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语句构建。