2016-09-09 1 views
1

Я читаю несколько файлов журнала. Журналы для Windows содержат такие пути, как C:\some\path.C++ string: Как заменить неэкранированный обратный слэш?

Когда я прочитал std::getline, я получаю строку, содержащую обратную косую черту без возврата. Как я могу заменить их косой чертой?

Я попытался

std::replace(str.begin(), str.end(), '\\', '/'); 

, но результат выглядит C:somepath вместо C:/some/path.

Как заменить \ на / или \\?

Эта строка затем используется для создания объекта JSON, поэтому не заменяя обратную косую черту, возникает недопустимый объект JSON.

+0

Джерри, спасибо за указание на отсутствии прецедента. Я обновил вопрос (см. Выше). Я использую строку для создания объекта JSON, поэтому не заменяя обратную косую черту приводит к недопустимому объекту JSON –

ответ

0

std::replace Звонок, который вы пробовали, абсолютно корректен и должен делать именно то, что вы хотите от него, поэтому единственная причина, по которой результирующая строка не содержит никаких косых черт, не была никакой ни одной косой черты.

Я предлагаю использовать отладчик, чтобы определить, что происходит с вашей строкой через всю свою жизнь

0

Escape character like newline using '\n' или обратная косая черта, как '\\', используются только в литералах, то есть в строках и символах вашего кода. В строковых или символьных переменных нет специальной обработки обратных косых черт.

Это потому, что обратные косые черты в строковых или символьных константах обрабатываются компилятором во время компиляции. Во время выполнения ничего не делается.

Таким образом, решение ваших проблем действительно ничего не значит.

+0

Фактически я использую содержимое для создания объекта JSON. Не делать ничего не является вариантом, поскольку результирующий объект JSON недействителен. –

+0

@ KarthikKrishnaswamy Вот почему так важно не только обратиться за помощью к решению, которое у вас есть, но и описать актуальную проблему, для которой решение (также известное как [проблема XY] (http://xyproblem.info/)) , –

0

Ладно, так что это для преобразования в формат JSON, где нужно модифицировать так или иначе (по-видимому, преобразование обратных слэша направить слэш допустим в этом случае, в противном случае вам нужно будет удвоить обратные черты, чтобы избежать их).

Ваша основная идея должна работать - просто заменить каждый \\ на / должно быть достаточно просто.

#include <iostream> 
#include <algorithm> 
#include <string> 
#include <cassert> 

int main() { 
    std::string in{"a\\b\\c\\d"}; 

    std::replace(in.begin(), in.end(), '\\', '/'); 

    assert(in == "a/b/c/d"); 

    std::cout << in; 
} 

Я не уверен, в чем проблема, с которой вы столкнулись - по крайней мере, для меня это похоже на работу. Конечно, это действительно имеет смысл как часть более крупной программы. Если бы вы сделали это отдельно, tr было бы вполне достаточно. Если вам действительно нужно, чтобы сделать его программу, SNOBOL бы сделать работу намного легче, чем C или C++:

loop: INPUT "\" = '/' . OUTPUT  : s(loop) 
Смежные вопросы