【问题标题】:concatenating strings and snprintf in c在c中连接字符串和snprintf
【发布时间】:2010-12-08 03:04:02
【问题描述】:

我想知道这是否是 concatenateNUL 终止包括宽度在内的字符串的正确方法。

#define FOO "foo"
const char *bar = "bar";
int n = 10;
float f = 10.2;

char *s;
int l;

l = snprintf (NULL, 0, "%-6s %-10s %4d %4f",FOO, bar, n, f);
s = malloc (l + 4); // should it be the number of formats tags?
if (s == null) return 1;
sprintf (s, "%-6s %-10s %4d %4f", FOO, bar, n, f);

【问题讨论】:

  • 为了维护目的,定义一个snprintfsprintf 都使用的格式字符串可能是一个好主意。如果在一个地方而不是另一个地方改变它真的很糟糕!
  • 这听起来是个好主意,是否可以发布一个示例代码来参考这个?谢谢
  • 只需声明const char* fmt_str = "%-6s %-10s %4d %4f"; 之类的内容,并将其用作您在两个地方的格式字符串。

标签: c concatenation printf


【解决方案1】:

相当多的系统在其标准 C 库中有一个函数 asprintf,它与您在此处所做的完全一样:allocate 和 sprintf

【讨论】:

    【解决方案2】:

    你只需要在snprintf()返回的值上加上1,因为只添加了一个空终止符。

    但是,您确实需要检查 l == -1(表示 snprintf() 失败)。

    【讨论】:

    • snprintf 未在原始 C89 中定义,我认为有一些平台具有不符合 C99 的实现,但 C99 确实说 snprintf(NULL, ...) 应该可以工作OP 在这里使用它的方式。
    • @ephemient:确实如此,我已经删除了那个位。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 2023-04-04
    • 2018-04-13
    • 1970-01-01
    相关资源
    最近更新 更多