Проблема удаления символов обратной косой черты в std :: string - PullRequest
2 голосов
/ 09 апреля 2019

Я пытаюсь выполнить команды CMD, которые я получаю десериализацией сообщения JSON.

При десериализации сообщения я сохраняю значение в переменной 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 ]

1 голос
/ 09 апреля 2019

Вот функция, которую я сделал в 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
}
1 голос
/ 09 апреля 2019

Хотя исходный код вашей программы содержит, строка, представленная литералом, не содержит никаких обратных косых черт, как продемонстрировано в следующем примере:

std::string command = "tzutil /s \"Romance Standard Time_dstoff\""; //Problem
std::cout << command;

// output:
tzutil /s "Romance Standard Time_dstoff"

Как таковое, нечего удалять из строки.

Обратная косая черта является escape-символом.\" - escape-последовательность, представляющая один символ, двойную кавычку.Это способ ввести символ двойной кавычки в строковом литерале, при этом эта кавычка не интерпретируется как конец строки.


Чтобы записать обратную косую черту в строковый литерал, вы можете его избежатьс обратной косой чертой.Следующая строка содержит обратную косую черту: "tzutil /s \\"Romance Standard Time_dstoff\\"".В этом случае удаление всех обратных косых черт может быть выполнено так:

command.erase(std::remove(command.begin(), command.end(), '\\'), command.end());

Однако простое удаление всех экземпляров символа может быть нецелесообразным.Если ваша строка содержит escape-последовательности, вам, вероятно, следует вместо этого удалить их.Это несколько сложнее.Вы не хотели бы удалять все обратные слэши, но вместо этого замените \" на " и \\ на \ и \n на новую строку и т. Д.

1 голос
/ 09 апреля 2019

Если вы хотите удалить все вхождения символа, вы можете использовать

#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); 
0 голосов
/ 09 апреля 2019

Вы можете использовать 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;
}
...