2011-02-03 76 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語句構建。