【问题标题】:get formatted string to a variable获取格式化字符串到变量
【发布时间】:2016-01-13 19:15:14
【问题描述】:

是否有任何 C 函数(或方法)可以将格式化字符串作为普通字符串?

例如:

printf("this is %s", "a message")

我希望printf()s 在char* 变量中输出"this is a message"。这应该很简单,但除了将其写入文件并根据需要多次读取或连接之外,我并没有提供其他东西。

那么,有没有一种函数或简单的方法可以将任何格式化的字符串放入 C 中的单个字符串变量中?

【问题讨论】:

标签: c string printf


【解决方案1】:

你想要sprintf或者snprintf

用法

char str[128];

//sprintf(str, "hello %s", "world");
snprintf(str, 128, "hello %s",  "world");

请注意,snprintf 更安全,因为它将字符串剪切到遇到溢出的适当长度。

文档


为什么snprintf 是安全的

snprintf 将输出写入字符串str,在格式字符串格式的控制下,指定后续参数如何转换为输出。它类似于sprintf(3),除了size 指定要生成的最大字符数。尾随的 nul 字符计入此限制,因此您必须为 str 分配至少 size 个字符。

如果size 为零,则不写入任何内容并且str 可能为空。否则,n-1st 之外的输出字符将被丢弃,而不是写入str,并且在实际写入str 的字符末尾写入一个 nul 字符。如果复制发生在重叠的对象之间,则行为未定义。

成功时,返回在 size 足够大时可以写入的字符数,不包括终止的 nul 字符。因此,当且仅当返回值为非负且小于 size 时,nul 终止的输出才被完全写入。出错时返回 -1(即编码错误)。

也就是说,snprintf 可以保护程序员免受缓冲区溢出的影响,而sprintf 则不会。

【讨论】:

  • “snprintf 更安全”hmmmm,没有展示如何检测不完整的写入,char buf[8]; snprintf(buf, sizeof buf, "del %s", "c:\\junk.txt"); cmd(buf); 似乎并不安全
  • 所有答案都很好,但这个很简短,给出了一个例子并链接到文档。谢谢!
  • @chux,这就是文档的用途。您唯一需要做的就是检查返回值。 "注意,只有当这个返回值是非负的并且小于n时,字符串才被完全写入。"
  • 这个答案提到“更安全”。文档没有。在没有展示正确用法的情况下,不支持 IMO 此处的“更安全” - 因此是评论。
  • @chux,没问题,我已经添加了一些解释(比答案本身更大)。
【解决方案2】:

使用sprintf:

sprintf( var, "this is %s", "a message" );

注意var 必须足够大以存储最终字符串(包括字符串终止符)。

【讨论】:

    【解决方案3】:

    是的,您要查找的函数是 sprintf()/snprintf()

    引用C11,第 7.21.6.5 章,snprintf() 函数

    int snprintf(char * restrict s, size_t n, const char * restrict format, ...);

    snprintf函数等价于fprintf,只是输出被写入 一个数组(由参数 s 指定)而不是流。

    它将格式化的字符串写入作为第一个参数提供的数组中。

    FWIW,这些函数不处理向提供的缓冲区(数组)分配(或检查)内存。在传递数组时,您需要确保目的地足够长以容纳最终结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-08
      • 2014-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多