【问题标题】:Formatting a string at runtime在运行时格式化字符串
【发布时间】:2014-03-31 10:17:15
【问题描述】:

我需要在运行时用 C 或 C++ 格式化字符串(但不需要像 this 示例那样使用 boost)。
例如:在运行时,我得到像这样的输入字符串“hello world %d %u %s”和带有值的数组。我必须打印格式化的字符串。

我正在寻找 c、c++ 或 std::function 的解决方案。
有人对我有想法吗?
提前致谢

编辑: 带值的数组是指一个字符数组,它按字节存储值。在上面的示例中,前四个字节将是第一个参数 %d,接下来的四个字节将是 %u 的值,依此类推。

【问题讨论】:

  • 也许您需要this 之类的东西?还是我误解了你的问题?
  • “带值的数组”?显示代码示例。
  • C 和 C++ 是两种不同的语言。使用其中之一。 std::function... 你这是什么意思?
  • 实现自己的 printf 相当复杂。例如,您是否支持 %-3.6s%04llu ?相反,如果您只支持一定数量的令牌,例如 %d 等,那么只需解析您的字符串以查找这些内容并在找到它们时对其进行操作。

标签: c++ c string


【解决方案1】:

如果您很早就知道这组值,但需要将它们保存在容器中直到知道要使用的格式字符串,那么您可以在将它们存储到vector<string> 之前将它们转换为字符串,然后执行使用简单的 find-next-%s / replace-with-next-vector-element 循环替换。

如果出于某种原因您希望/需要将值保留为具有看似不同类型的值的数组,并将它们转换为字符串直到稍后,那么您必须实现某种方式的可区分联合或多态变体类,例如:

 struct Value
 {
     virtual ~Value() { }
     virtual std::string to_string() const = 0;
 };

 struct Int
 {
     Int(int x) : x_(x) { }
     std::string to_string() const override { return std::to_string(x); }
     int x_;
 };

 struct String
 {
     String(const std::string& x) : x_(x) { }
     std::string to_string() const override { return x_; }
     std::string x_;
 };

 std::vector<Value*> values;

然后,您可以遍历调用 to_string() 的值,以获取要替换为格式字符串的文本。

【讨论】:

    【解决方案2】:

    在 C 中,这不是直接可能的,除非您的“值数组”是 va_list 值,在这种情况下您只需要调用 vsnprintf()

    另外的问题是 C 中没有典型的方法来表示不同(本机)类型的“值数组”。

    【讨论】:

    • 它不是 va_list 因为它是堆上的一个向量
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多