2016-09-09 2 views
1

일부 로그 파일을 읽습니다. Windows 로그에는 C:\some\path과 같은 경로가 있습니다.C++ 문자열 : 이스케이프 처리되지 않은 백 슬래시를 바꾸는 방법?

std::getline으로 읽을 때 이스케이프 처리되지 않은 백 슬래시가 포함 된 문자열이 표시됩니다. 어떻게 그들을 슬래시로 바꿀 수 있습니까?

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

을 시도했지만 결과는 C:somepath 대신 C:/some/path 것 같습니다.

\/ 또는 \\으로 대체하려면 어떻게해야하나요?

이 문자열은 JSON 객체를 작성하는 데 사용되므로 백 슬래시를 바꾸지 않으면 잘못된 JSON 객체가 반환됩니다.

+0

제리, 사용 사례의 부족을 지적 주셔서 감사합니다. 질문을 업데이트했습니다 (위 참조). 문자열을 사용하여 JSON 객체를 만들었으므로 잘못된 JSON 객체에서 백 슬래시 결과를 대체하지 마십시오. –

답변

0

시도한 호출이 완벽하게 유효하고 원하는 결과를 정확하게 수행해야하므로 결과 문자열에 슬래시가 포함되지 않는 유일한 이유는 처음부터 어떤 종류의 슬래시도 없다는 것입니다.

나는

0

'\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) 
관련 문제