2013-02-26 29 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控制它的大小可能更安全。

相关问题