使用std :: vector(可变大小)打印格式化的字符串

时间:2018-07-25 10:11:52

标签: c++builder

我使用Magento 2 REST API,并希望处理C ++中引发的错误。

错误响应示例:

{
  "message": "Could not save category: %1",
  "parameters": [
    "URL key for specified store already exists."
  ]
}

我可以将它们都检索到String和std :: vector中,这让我想到了一个问题:

我如何返回通过填充占位符格式化的字符串?

在固定大小的情况下,我可以按照此方法进行操作

char* buffer = new char[200];
String message = "Could not save category: %1";
std::vector<String> parameters = {"URL key for specified store already exists."};

String result = sprintf(buffer,message.c_str(),parameters[0]);

但是,a,我事先不知道尺寸。

我应该如何去做?是否有stl函数可以提供帮助,是否应该使用自行编写的模板(对此没有经验),可以将std :: vector转换为va_list还是有其他解决方案?

1 个答案:

答案 0 :(得分:1)

编辑:我没有注意到这要求C ++方言而不是Standard C ++。暂时保留它,可能对其他人有用。


不存在能够自动执行此操作的标准。话虽如此,如果您的插值格式仅为datetime2(6),则可能很容易编写:

%<number>

这会将结果放入string message = "Could not save category: %1"; std::vector<string> parameters = {"URL key for specified store already exists."}; for (size_t i = 0; i < parameters.size(); ++i) { const auto interp = "%" + std::to_string(i+1); const size_t pos = message.find(interp); if (pos != std::string::npos) message.replace(pos, interp.size(), parameters[i]); } 字符串中。当然,这种实现方式是有限的,并不是特别有效,但是要再次正确地做到这一点,需要库大小的解决方案,而不是SO-answer大小的解决方案。

live version