2016-09-09 215 views
1

我正在閱讀一些日誌文件。 Windows的日誌包含路徑如C:\some\pathC++字符串:如何替換未轉義的反斜槓?

當我用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)