2010-12-14 11 views
5

Mam więc ciąg:Wymień tyłu tnie z przodu ukośniki lub podwójne tyłu ukośniki w C++

string path = "C:\Users\Richard\Documents\Visual Studio 2010\Projects\Client\Debug"; 

Chcę wymienić wszystkie wsteczne ukośniki w nim z nich do przodu, tak to wygląda:

C:/Users/Richard/Documents/Visual Studio 2010/Projects/Client/Debug 

to nie działa:

string toReplace = "\\"; 
path.replace(path.find(toReplace), toReplace.length(), "/"); 

Oczywiście, \ jest znakiem ucieczki, tak że prawdopodobnie jest przyczyną y e problem.

+0

jak dokładnie nie działa? –

+0

Co stanie się, gdy spróbujesz? –

Odpowiedz

13

Dostaję błąd kompilatora na twoim ciągu path za pomocą g ++, ponieważ zawiera on nieprawidłowe kody escape. Najwyraźniej MSVC generuje ostrzeżenia, ale nie ma na to błędów (patrz odpowiedź Michaela Burra). Więc jeśli naprawdę używasz opublikowanego path, zmień ukośniki odwrotne na podwójne ukośniki odwrotne.

Poprawię to, stwierdzam, że twój kod zastępuje tylko pierwszy ukośnik odwrotny i pozostawia pozostałe. Może chcesz użyć std::replace(), tak:

std::replace(path.begin(), path.end(), '\\', '/'); 
+4

Nie sądzę, że to zadziała. 'std :: replace' będzie szukał \ znaku, ale nie znajdzie żadnego ciągu w łańcuchu, ponieważ kompilator zinterpretuje każde \ jako znak ucieczki dla litery po nim. – Maxpm

+1

@Maxpm, ta odpowiedź jest najlepszym sposobem na znalezienie/zastąpienie pojedynczego znaku. Należy jednak zauważyć, że rzeczywisty łańcuch dostarczony przez PO musi być właściwie usunięty, aby to zadziałało. –

+0

Moja instalacja GCC (MinGW z GCC 4.5.1) z dowolnymi opcjami skonfigurowanymi w moim skrypcie dla wywoływania g ++ (-Wall prawdopodobnie jest jedynym, który ma znaczenie) tylko bierze pod uwagę niepoprawną sekwencję ucieczki '\ U' tutaj błąd . Wszystkie pozostałe to tylko ostrzeżenia. VC uważa je za wszystkie ostrzeżenia. –

9

Jeśli masz coś takiego:

string path = "C:\Users\Richard\Documents\Visual Studio 2010\Projects\Client\Debug"; 

to każda postać proceded przez '\' jest znak specjalny. Prawidłowy sposób to

string path = "C:\\Users\\Richard\\Documents\\Visual Studio 2010\\Projects\\Client\\Debug"; 

Użyj std :: replace jak powiedział Fred.

2

Czy "ścieżka łańcuchowa = ..." w pliku źródłowym jest pokazana? Jeśli tak, to nie ma odwrotnych ukośników do zastąpienia.

następujący program:

#include <iostream> 
#include <string> 

using namespace std; 

int main() 
{ 
    string path = "C:\Users\Richard\Documents\Visual Studio 2010\Projects\Client\Debug"; 

    cout << path; 
} 

Wyjścia:

C:UsersRichardDocumentsVisual Studio 2010ProjectsClientDebug 

Uwaga: Podane zestawia programu (z grupą ostrzeżeń) w MSVC (poprzez VS2010), ale GCC 4.5.1 Otrzymuję komunikat błędu:

C:\temp\test.cpp:8:19: error: incomplete universal character name \U 

Zachowanie MSVC dla tego błędu (lub GCC w tym przypadku) może być konfigurowalne z odpowiednimi opcjami.

2

Z tego, co wiem, nie można tego zrobić z podanego ciągu. Twój kod próbuje uciec znaki U, R, D, V, P itp

Jeśli łańcuch jest zakodowany, będziesz musiał użyć podwójnych ukośników (tj C:\\Users\\Richard...).

Jeśli ciąg znaków jest ścieżką, którą, powiedzmy, użytkownik wprowadzi, możliwe będzie programowe dodawanie znaków ucieczki.

+2

Jeśli ciąg znaków jest wprowadzany przez użytkownika, nie musisz niczego wymykać. – UncleBens

0

Spróbuj użyć ciągu.findfirsof ('\');

Powiązane problemy