2010-12-14 17 views
5

Así que tengo una cadena:Reemplazar hacia atrás barras inclinadas con delanteros barras o barras invertidas dobles en C++

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

quiero reemplazar todas las barras invertidas en ella con los delanteros por lo que parece:

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

Esto no funciona:

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

Obviamente, \ es un carácter de escape de manera que probablemente está causando º e problema

+0

¿cómo exactamente no funciona? –

+0

¿Qué sucede cuando lo intentas? –

Respuesta

13

Aparece un error de compilación en su cadena path con g ++, ya que contiene códigos de escape no válidos. Aparentemente, MSVC produce advertencias pero no errores para eso (ver la respuesta de Michael Burr). Entonces, si realmente está usando el path que ha publicado, cambie las barras diagonales inversas a barras diagonales inversas dobles.

Corrigiendo eso, encuentro que su código reemplaza solo la primera barra invertida y deja las otras. Tal vez usted quiere utilizar std::replace(), así:

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

No creo que eso funcione. 'std :: replace' buscará el carácter \, pero no encontrará ninguno en la cadena porque el compilador interpretará cada \ para ser un carácter de escape para la letra que está detrás de él. – Maxpm

+1

@Maxpm, esta es la mejor forma de buscar/reemplazar un solo personaje. Pero debe tenerse en cuenta que la cadena real proporcionada por el OP necesita ser escapada correctamente para que esto funcione. –

+0

Mi instalación de GCC (MinGW con GCC 4.5.1) con cualquier opción que haya configurado en mi script para invocar g ++ (-Wall probablemente sea el único que importa) solo considera la secuencia de escape inválida '\ U' aquí un error . Todos los demás son solo advertencias. VC los considera todas las advertencias. –

9

Si usted tiene algo como esto:

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

que cada personaje procedió por '\' es un carácter especial. La forma correcta es

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

Use std :: replace como dijo Fred.

2

¿La "ruta de cadena = ..." en su archivo fuente como se muestra? Si es así, entonces no hay barras invertidas para reemplazar.

el siguiente programa:

#include <iostream> 
#include <string> 

using namespace std; 

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

    cout << path; 
} 

Salidas:

C:UsersRichardDocumentsVisual Studio 2010ProjectsClientDebug 

Nota: las compilaciones de programas anteriores (con un montón de advertencias) en MSVC (a través de VS2010), pero con GCC 4.5.1 Me sale un error:

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

El comportamiento de MSVC para este error (o GCC para el caso) podría ser configurable con las opciones adecuadas.

2

Por lo que yo sé, no hay forma de hacerlo a partir de la cadena especificada. Su código está tratando de escapar de los personajes U, R, D, V, P, etc.

Si la cadena está codificada, que tendrá que utilizar dobles barras (es decir, C:\\Users\\Richard...).

Si la cadena es una ruta que, digamos, el usuario ingresa, es posible que pueda agregar los caracteres de escape mediante programación.

+2

Si la cadena es una entrada del usuario, entonces no necesitará escapar nada. – UncleBens

0

Intenta usar la secuencia.findfirsof ('\');

Cuestiones relacionadas