我尝试使用将返回char * rv
的函数调用的结果连接到int
。 fib()
返回一个int。我遇到的主要问题是strcat()
的签名需要const char *
,因为它是第二个arg:
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 :(得分:3)
使用snprintf()
构造一个包含int
的缓冲区,然后将其连接到rv
缓冲区。 不尝试在rv
的同一次调用中连接snprintf()
的现有内容:
snprintf(rv, 2048, "%s%d", rv, itoa(fib(num), rv,10)));
因为这意味着输入和输出缓冲区重叠,这是未定义的行为。
此外:
sizeof(char)
保证为1
所以malloc()
调用将是:
rv = malloc(2048);
if (rv)
{
}
答案 1 :(得分:2)
你可以这样做
sprintf(dest,"%s %d",rv,num);
答案 2 :(得分:2)
您需要一个中间char
数组才能在strcat
之前打印该数字,或者您可以直接sprintf
将该数字设为rv
,但为此您需要指向结尾的指针
char *rv = malloc(2048);
char *rv_end = rv;
...
rv_end += sprintf(rv_end, "%d", fib(num));
并在将其他内容附加到缓冲区时更新rv_end
指针。
(感谢jthill使用sprintf
的返回值进行改进。)
答案 3 :(得分:1)
char * strcat ( char * destination, const char * source );
源上的“const”只是告诉编译器strcat函数不会修改“source”。否则,
strcat(buffer, "hi");
是不允许的。
这并不意味着你的源必须是常量,也不应该有const修饰符。
strcat(rv, (char *)itoa(fib(num), rv,10));
(没有“const”)完全合法,不应生成任何编译器警告。
唯一的问题是,如果您不知道源的长度,那么您将打开缓冲区溢出。在这种特殊情况下,您可以确定itoa返回的时间长度并相应地调整目标的大小。但是,我们snprintf可能更安全地控制它的大小。