使用strcat()与字符串和int的最有效方法?

时间:2013-02-26 16:50:03

标签: c casting int concatenation strcat

我尝试使用将返回char * rv的函数调用的结果连接到intfib()返回一个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

感谢您提供任何帮助!

4 个答案:

答案 0 :(得分:3)

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

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

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

此外:

所以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可能更安全地控制它的大小。