C++ std::字符串中的特殊字符转义

C++ std::字符串中的特殊字符转义,c++,string,stl,C++,String,Stl,我有一个std::string对象。上下文应传递给日志函数,该函数以类似于printf的格式接受参数。但参数的存储存在局限性。参数只能使用几个字节 字符串是从文件中读取的,除了它只包含可读字符之外,我不能做任何假设。函数将解释字符串并特别注意“%”字符。但由于这不是真正的格式字符串,我需要转义百分比字符 编辑:日志函数在参数和功能大小方面受到限制,因此无法将“%s”用作格式字符串,而将字符串用作参数。因此,我需要转换字符串。所以log(“%s”,foo.c_str())是不可能的 如何在std:

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

字符串是从文件中读取的,除了它只包含可读字符之外,我不能做任何假设。函数将解释字符串并特别注意“%”字符。但由于这不是真正的格式字符串,我需要转义百分比字符

编辑:日志函数在参数和功能大小方面受到限制,因此无法将
“%s”
用作格式字符串,而将字符串用作参数。因此,我需要转换字符串。所以
log(“%s”,foo.c_str())
是不可能的

如何在
std::string
中复制所有百分比符号

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

foo
在转义后应为“got 7%%\n”。

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


而是将
“%s”
作为格式字符串传递,并将字符串作为参数传递到打印。

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

log("%s", 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());

我找到了一个比Remys精细答案中的解决方案更优雅的解决方案

#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());
#包括
#包括
#包括
标准::正则表达式百分比(L“%”);
std::字符串s;
// ... 从文件中获取一行。。。
s=标准::正则表达式替换(s,百分比,L“%”);
日志(s.c_str());

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

是否有关于向下投票的注释?您根本不需要转义字符串,因为您不应该首先将其作为格式字符串传递。使用一个单独的格式字符串
“%s”
并将该字符串作为其参数传递,例如:
log(“%s”,foo.c_str())
log(“%s”,foo.size(),foo.c_str())
getline()函数不会对它读取的字符执行任何处理,因此不必转义任何内容。但是你的问题还很不清楚。@NeilButterworth,因为你可以在问题中读到内容来自外部来源。因此,您不应假设读取函数(例如,
getline
将负责内容)。@RemyLebeau特殊日志函数是有限的,可以与
“%s”
一起使用。因为您可以读取,我想在程序中根据输入生成一个格式字符串。如果我不经治疗就把这些绳子传过去,我就不会问了<代码>%s“因某种原因被排除在问题之外。
#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());