在运行时格式化字符串

时间:2014-03-31 10:17:16

标签: c++ c string

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

我正在寻找c,c ++或std :: function的解决方案 有没有人对我有所了解?
提前致谢

编辑: 带有值的数组表示一个char数组,用于逐字节存储值。在上面的例子中,四个第一个字节将是第一个参数%d,接下来的四个字节将是%u的值,依此类推。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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()的值,以便将文本替换为格式字符串。