问题删除std :: string上的反斜杠字符

时间:2019-04-09 10:23:02

标签: c++ string cmd command

我正在尝试执行要反序列化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());

有什么办法吗?

我将不胜感激。

4 个答案:

答案 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;
}