获取完整的字符串,同时具有格式和参数 c++

Posted

技术标签:

【中文标题】获取完整的字符串,同时具有格式和参数 c++【英文标题】:get the full string, while having format and args c++ 【发布时间】:2016-05-09 06:31:12 【问题描述】:

我正在使用 c++ 11。我想编写一个函数来获取格式化字符串和 args(不知道有多少,需要可变参数)并返回完整的字符串。

例如:

format = "TimeStampRecord Type=%u Version=%u OptimizeBlockID=%u WriteBlockID=%u Timestamp=%lu"

INDEX_RECORD_TYPE_TIMESTAMP = 3;
FORAMT_VERSION = 1;
optimizeBlockId = 549;
writeBlockId = 4294967295;
timestamp = 1668;

返回值是一个字符串,如下所示:

"TimeStampRecord Type=3 Version=1 OptimizeBlockID=549 WriteBlockID=4294967295 Timestamp=1668"

有什么有效的方法吗?

【问题讨论】:

什么,你的意思是std::snprintf autosprintf, Boost.Format abel.web.elte.hu/mpllibs/safe_printf/index.html怎么样 @Joachim Pileborg 我不知道缓冲区的大小 你知道格式的长度,你知道参数的数量和类型。这意味着您可以轻松地创建一个 std::string 对象,该对象具有足够的空间来容纳参数的最大值,并将其用作调用 snprintf 的目标。 【参考方案1】:

您可以使用Boost Format。还是老好sprintf()

char buf[1000];
int bytes = snprintf(buf, sizeof(buf), format, INDEX_RECORD_TYPE_TIMESTAMP,
    FORMAT_VERSION, optimizeBlockId, writeBlockId, timestamp);
assert(bytes < sizeof(buf));
string result(buf, min(sizeof(buf), bytes)); // now you have a C++ string

【讨论】:

【参考方案2】:

您可以按照上面的建议使用 snprintf。 如果您想自己实现或使用自己的占位符:

#include "iostream"
#include "string"

void formatImpl(std::string& fmtStr) 


template<typename T, typename ...Ts>
void formatImpl(std::string& fmtStr, T arg, Ts... args) 
  // Deal with fmtStr and the first arg
  formatImpl(fmtStr, args...);


template<typename ...Ts>
std::string format(const std::string& fmtStr, Ts ...args) 
  std::string fmtStr_(fmtStr);
  formatImpl(fmtStr_, args...);
  return fmtStr_;



int main() 
  std::string fmtStr = "hello %your_placeholder world";
  std::cout << format(fmtStr, 1, 'a') << std::endl;
  return 0;

https://godbolt.org/g/hFwiS0

【讨论】:

以上是关于获取完整的字符串,同时具有格式和参数 c++的主要内容,如果未能解决你的问题,请参考以下文章

C++中如何获取参数的值以及对字符串进行处理

在 C++ 中解析具有特定格式的字符串

C++:从具有固定格式的字符串中挑选部分/数据

printf 和 fprintf 在c 和c++中的使用。

创建具有无限参数的方法?

C++ 可能同时读取 int 和字符串