3

我正在尝试char * rv与将返回int. fib()返回一个整数。我遇到的主要问题是strcat()签名需要 aconst char *因为它是第二个参数:

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

感谢您提供任何帮助!

4

4 回答 4

3

用于snprintf()构造一个包含 的缓冲区int,然后将其连接到您的rv缓冲区。不要尝试rv将同一调用中的现有内容连接到snprintf()

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

因为这意味着输入和输出缓冲区重叠,这是未定义的行为。

还:

所以malloc()电话是:

rv = malloc(2048);
if (rv)
{
}
于 2013-02-26T16:55:37.317 回答
2

你可以这样做

sprintf(dest,"%s %d",rv,num);
于 2013-02-26T16:55:23.547 回答
2

您需要一个中间char数组来在strcating 之前打印数字,或者您可以直接sprintf将数字打印到rv,但为此您需要一个指向末尾的指针,

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

rv_end在将其他内容附加到缓冲区时更新指针。

(感谢jthill使用 的返回值进行改进sprintf。)

于 2013-02-26T16:58:25.667 回答
1
char * strcat ( char * destination, const char * source );

source 上的“const”只是告诉编译器 strcat 函数不会修改“source”。否则,

strcat(buffer, "hi");

不会被允许的。

这并不意味着您的源必须是常量,也不应该具有 const 修饰符。

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

(no "const") 是完全合法的,不应产生任何编译器警告。

唯一的问题是,如果您不知道源的长度,您就会面临缓冲区溢出。在这种特殊情况下,您可以计算出 itoa 返回的时间并相应地调整目的地的大小。然而,对我们 snprintf 来说,控制它的大小可能更安全。

于 2013-02-26T20:01:44.293 回答