我正在尝试执行要反序列化JSON消息的CMD命令。
反序列化消息时,我将值存储在std::string
变量中,该变量的值为"tzutil /s \"Romance Standard Time_dstoff\""
:
当我收到带有浮引号参数(例如"tzutil /s "Romance Standard Time_dstoff""
)的命令时,我想删除反斜杠字符('\')。
std::string command = "tzutil /s \"Romance Standard Time_dstoff\""; //Problem
system(command.c_str());
有什么办法吗?
我将不胜感激。
答案 0 :(得分:1)
如果您希望删除所有出现的字符,则可以使用
#include <algorithm>
str.erase(std::remove(str.begin(), str.end(), char_to_remove), str.end());
如果您希望将其替换为另一个字符,请尝试
#include <algorithm>
std::replace(str.begin(), str.end(), old_char, new_char);
答案 1 :(得分:1)
尽管程序的源代码中确实包含有该字符串,但由文字表示的字符串不包含任何反斜杠,如以下示例中的demonstrated:
std::string command = "tzutil /s \"Romance Standard Time_dstoff\""; //Problem
std::cout << command;
// output:
tzutil /s "Romance Standard Time_dstoff"
因此,没有任何内容可从字符串中删除。
反斜杠是转义字符。 \"
是一个转义序列,代表一个字符,即双引号。这是在字符串文字中键入双引号字符的一种方式,而不会将该引号解释为字符串的结尾。
要将反斜杠写入字符串文字中,可以使用反斜杠转义。以下字符串包含反斜杠:"tzutil /s \\"Romance Standard Time_dstoff\\""
。在这种情况下,可以这样删除所有反斜杠:
command.erase(std::remove(command.begin(), command.end(), '\\'), command.end());
但是,简单地删除字符的所有实例可能并不明智。如果您的字符串包含转义序列,那么您可能应该做的是取消转义序列。这有点复杂。您不想删除所有反斜杠,而是将\"
替换为"
,将\\
替换为\
,并将\n
替换为换行,依此类推。 / p>
答案 2 :(得分:1)
这是我用C ++为自己的项目之一创建的用于替换子字符串的函数。
std::string
Replace(std::string str,
const std::string& oldStr,
const std::string& newStr)
{
size_t index = str.find(oldStr);
while(index != str.npos)
{
str = str.substr(0, index) +
newStr + str.substr(index + oldStr.size());
index = str.find(oldStr, index + newStr.size());
}
return str;
}
int main(){
std::string command = GetCommandFromJsonSource();
command = Replace(command, "\\\"", "\""); // unescape only double quotes
}
答案 3 :(得分:0)
您可以使用std :: quoted在字符串文字之间进行转换。
#include <iomanip> // -> std::quoted
#include <iostream>
#include <sstream>
int main() {
std::istringstream s("\"Hello world\\n\"");
std::string hello;
s >> std::quoted(hello);
std::cout << std::quoted(s) << ": " << s;
}