我有一个std :: string对象。应该将上下文传递到一个接受类似于printf
的格式样式的参数的日志函数。但是参数的存储存在限制。参数只能使用几个字节。
该字符串是从文件中读取的,除了只包含可读字符外,我无法做任何假设。该函数将解释字符串,并特别注意'%'字符。但这不是真正的格式字符串,因此我需要转义百分号。
编辑: log函数受参数和功能大小的限制,因此无法使用"%s"
作为格式字符串和字符串作为参数。因此,我需要转换字符串。因此log("%s", foo.c_str())
是不可能的。
如何在std::string
中重复所有百分号?
std::string foo = "got 7%\n";
foo
在转义后应“获得7 %% \ n”。
答案 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());
我没有检查性能,因为这在我的用例中并不重要。