在std :: string

时间:2018-07-21 16:35:15

标签: c++ string stl

我有一个std :: string对象。应该将上下文传递到一个接受类似于printf的格式样式的参数的日志函数。但是参数的存储存在限制。参数只能使用几个字节。

该字符串是从文件中读取的,除了只包含可读字符外,我无法做任何假设。该函数将解释字符串,并特别注意'%'字符。但这不是真正的格式字符串,因此我需要转义百分号。

编辑: log函数受参数和功能大小的限制,因此无法使用"%s"作为格式字符串和字符串作为参数。因此,我需要转换字符串。因此log("%s", foo.c_str())是不可能的。

如何在std::string中重复所有百分号?

std::string foo = "got 7%\n";

foo在转义后应“获得7 %% \ n”。

3 个答案:

答案 0 :(得分:1)

如果该函数是真正的printf样式函数,则无需转义字符串。不要将字符串作为格式字符串传递,请使用单独的"%s"格式字符串,并将字符串作为参数传递,例如:

log("%s", foo.c_str());

log("%.*s", foo.size(), foo.c_str());

如果这不是一个选择,则需要在循环中手动替换%字符,例如:

std::string::size_type i = foo.find('%');
while (i != std::string::npos)
{
    foo.replace(i, 1, "%%");
    i = foo.find('%', i+2);
}
log(foo.c_str());

答案 1 :(得分:0)

请勿将非程序存储/生成的字符串作为格式字符串传递。

相反,将"%s"作为格式字符串传递,并将该字符串作为参数传递以打印。

答案 2 :(得分:0)

我找到了一个比雷米斯很好的答案看起来更优雅的解决方案。

#include <string>
#include <regex>
#include <logutil.h>

std::regex percent(L"%");

std::string s;
// ... get a line from file ...

s = std::regex_replace(s, percent, L"%%");
log(s.c_str());

我没有检查性能,因为这在我的用例中并不重要。