2013-02-26 62 views
3

我試圖連接到char * rv與函數調用的結果,將返回intfib()返回一個int。我運行到的主要問題是,strcat()的簽名要求const char *作爲它的第二個ARG:最有效的方式使用strcat()與字符串和int?

char * strcat (char * destination, const char * source); 

這裏是我的代碼一小部分。 fib()計算第n斐波那契數 - 在這種情況下,第7斐波那契數。

char * rv; 
int num; 

rv = (char*)malloc(2048*sizeof(char)); 
num = 7; 

... 

strcat(rv, (const char *)itoa(fib(num), rv,10)); 

這顯然是錯誤的,將無法編譯。什麼是最乾淨的方式來做到這一點?我是否需要另一個char * var首先存儲itoa()的結果,而不是使用rv

感謝您提供任何幫助!

+0

題外話,但我建議'RV = malloc的(2048 * *的sizeof RV)';在C中鑄造malloc的結果是毫無意義的,並且參數中的重複類型名稱只是在稍後更改類型時等待發生。 – jthill 2013-02-26 17:06:00

回答

2

您需要任何中間char數組追加其他事情的時候才strcat ING打印數量,或者您可以直接sprintf數量rv,但你需要一個指針到結束,

char *rv = malloc(2048); 
char *rv_end = rv; 
... 
rv_end += sprintf(rv_end, "%d", fib(num)); 

,並更新rv_end指針緩衝。

(感謝jthill使用的sprintf返回值的提高。)

+1

或'rv_end + = sprintf的(rv_end, 「%d」,FIB(NUM));' – jthill 2013-02-26 17:07:32

+0

謝謝您的答覆。假設我想在你的代碼後面附加一個字符串到rv。我可以使用'sprintf(rv_end,「%s」,「Hello World」)嗎?然後再次更新'rv_end + = strlen(rv_end);'? – iaacp 2013-02-26 17:08:28

+0

@iaacp是的,但它是更好的使用jthill的改善。 – 2013-02-26 17:09:20

2

你能做到這一點

sprintf(dest,"%s %d",rv,num); 
3

使用snprintf()構建含有int一個緩衝,然後將其串連到你rv緩衝區。難道嘗試的rv在同一呼叫現有的內容串連到snprintf()

snprintf(rv, 2048, "%s%d", rv, itoa(fib(num), rv,10))); 

因爲這意味着輸入和輸出緩衝區重疊這是不確定的行爲。

另外:

所以malloc()電話是:

rv = malloc(2048); 
if (rv) 
{ 
} 
1
char * strcat (char * destination, const char * source); 

源「常量」簡單地告訴了strcat的功能將不會修改「源」的編譯器。否則,

strcat(buffer, "hi"); 

將不被允許。

這並不意味着你的源必須是常量,也不應該有const修飾符。

strcat(rv, (char *)itoa(fib(num), rv,10)); 

(no「const」)是完全合法的,不應該產生任何編譯器警告。

唯一的問題是,如果你不知道源的長度,你打開自己高達緩衝區溢出。在這種特殊情況下,您可以計算itoa返回的時間長短並相應地調整目的地的大小。但是,我們snprintf控制它的大小可能更安全。

相關問題