从C中的变量构建字符串

时间:2011-02-03 01:47:54

标签: c string printf

我正在研究一个使用套接字的简单的二十一点游戏,这是我的操作系统类的礼貌。 我们给了一个socket接口,它已经来回传递一个字符数组。

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

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

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

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

3 个答案:

答案 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 *bufasprintf动态展开,并通过将自身格式化为asprintf语句来构建。