2010-12-14 29 views
5

Così ho una stringa:Sostituire all'indietro barre con in avanti riduce considerevolmente o doppie barre rovesciate in C++

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

voglio sostituire tutte le barre rovesciate in essa con quelli previsionali in modo che appaia come:

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

Questo non funziona:

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

Ovviamente, \ è un carattere di escape in modo che è probabilmente causato da th e problema

+0

come esattamente non funziona? –

+0

Cosa succede quando lo provi? –

risposta

13

Viene visualizzato un errore del compilatore sulla stringa path con g ++, poiché contiene codici di escape non validi. Apparentemente, MSVC produce avvertimenti ma non errori (vedi la risposta di Michael Burr). Quindi, se stai utilizzando veramente lo path che hai pubblicato, cambia le barre inverse per raddoppiare le barre inverse.

Correggendolo, trovo che il codice sostituisce solo la prima barra retroversa e lascia gli altri. Forse si vuole utilizzare std::replace(), in questo modo:

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

Non penso che funzionerà. 'std :: replace' cercherà il carattere \, ma non troverà nessuno nella stringa perché il compilatore interpreterà ogni \ un carattere di escape per la lettera successiva. – Maxpm

+1

@Maxpm, questa risposta è il modo migliore per trovare/sostituire un singolo carattere. Ma va notato che la stringa effettiva fornita dall'OP deve essere opportunamente scappata perché funzioni. –

+0

La mia installazione di GCC (MinGW con GCC 4.5.1) con tutte le opzioni che ho impostato nel mio script per invocare g ++ (-Wall probabilmente è l'unica che conta) considera solo la sequenza di escape '\ U' non valida qui un errore . Tutti gli altri sono solo avvertimenti. VC li considera tutti gli avvisi. –

9

Se hai qualcosa di simile:

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

ogni carattere proceded da '\' è un carattere speciale. Il modo corretto è

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

Utilizzare std :: sostituire come ha detto Fred.

2

"string path = ..." nel file sorgente come mostrato? In tal caso, non ci sono backslash da sostituire.

Il seguente programma:

#include <iostream> 
#include <string> 

using namespace std; 

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

    cout << path; 
} 

Uscite:

C:UsersRichardDocumentsVisual Studio 2010ProjectsClientDebug 

Nota: le compilazioni di programma di cui sopra (con un mazzo di avvertimenti) in MSVC (attraverso VS2010), ma con GCC 4.5.1 Viene visualizzato un messaggio di errore:

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

Il comportamento di MSVC per questo errore (o GCC per quella materia) potrebbe essere configurabile con le opzioni appropriate.

2

Per quanto ne so, non c'è modo di farlo dalla stringa specificata. Il tuo codice sta cercando di scappare i personaggi U, R, D, V, P, ecc

Se la stringa è hard-coded, dovrete usare doppie barre (vale a dire, C:\\Users\\Richard...).

Se la stringa è un percorso che, ad esempio, l'utente inserisce, potresti essere in grado di aggiungere i caratteri di escape a livello di codice.

+2

Se la stringa è l'input dell'utente, non è necessario uscire da nessuna parte. – UncleBens

0

Provare a utilizzare la stringa.findfirsof ('\');

Problemi correlati