2

这似乎是一个以前会问的问题,但我找不到。(如果你这样做,请指出我并关闭它作为副本。)

我有这样的 C 代码:

printf("some characters");
for (; n >= 0; n--)
{
    printf(", %s", f(n, k));
}
printf("more characters");

对于一些在这里不重要的变量nk函数。char* f(int n, int k)n并且k不是恒定的。)我想将上面的代码转换为返回 achar*而不是简单地使用printf来显示它的函数。(它最终会被打印出来,但这让我可以做一些重构,当然更容易测试。)当然我可以创建字符串并逐个字符地复制它们,但肯定有更好的(更干净的,更快,更惯用)的方式来做到这一点。

在我的特定应用程序f中,是一个非常简单的函数,有点像 的亲戚itos,但由于k. 但我欢迎对这种情况有益的想法,因为它可能在未来对其他人有用。

4

1 回答 1

5

第 1 步是为字符串分配足够大的缓冲区。然后用于sprintf打印到缓冲区中。标准的成语是

int index = sprintf( buffer, "some characters" );
for (; n >= 0; n--)
{
    index += sprintf( &buffer[index], ", %s", f(n, k) );
}
index += sprintf( &buffer[index], "more characters" );

sprintf函数返回它写入的字符串的长度,这使您可以跟踪您在缓冲区中的位置。


您还可以让调用者传递缓冲区和大小。在这种情况下,最好使用snprintf以避免溢出缓冲区。所以函数看起来像这样

char *create_string( char *buffer, int size, int n, int k )
{
    ...
    index += snprintf( &buffer[index], size-index, ", %s", f(n, k) );
    ...
    return buffer;
}

其中size参数是buffer.

于 2016-08-18T04:54:49.140 回答