2012-05-09 12 views
13

¿Cuál es el equivalente en C++ del símbolo C# @ prefijando cadenas? Para escapar de los símbolos de forma automática?¿Cuál es el equivalente en C++ del símbolo C# @ prefijando cadenas?

Ejemplo: var howManySlashesAreThereIn = @"\\\\\\";

+1

Quiere decir cadenas verbatim. – Mehrdad

+0

posible duplicado de [Cadena de literales C++?] (Http://stackoverflow.com/questions/2597322/string-literals-c) – Mehrdad

+0

@Jake - Gotcha! Gracias por la aclaración. El término .Net es "literal de cadena verbatim", y el propósito es que "\" no se trate como un carácter de escape: http://msdn.microsoft.com/en-us/library/aa691090%28v=vs .71% 29.aspx. No hay equivalente en Java ni en las versiones actuales de C++ (y no, I * no * considera que C++ 11 sea una "versión actual";)) – paulsm4

Respuesta

27

En C++ 11, puede utilizar literales de cadena primas:

std::string s = R"(This\is\a\raw\string\literal)"; 

std::string s = R"*(This \one contains \a)", which would normally end the string)*"; 

Aquí es la palabra C++11 FAQ en él, y una reference.

8

Está buscando la característica "cadena sin procesar" de C++ pero es una adición bastante reciente (C++ 11, creo).

std::string howManySlashesAreThereIn = R"(\\\\\\)"; 

Está documentado en 2.14.5 String lieterals del estándar C++ 11, sin embargo, que tomo puede ser un poco seco para ti, así que te sugiero googlear arriba en "raw string" c++.

Además de deshacerse de los escapar duplicando monstrosites como "\\\\nasbox\\sharename\\downloads\\super_sekrit_stuff", sino que también le permite evitar la "adición de \n personajes y la combinación de cadenas adyacentes" truco como torneado:

htmlString = 
    "<HTML>\n" 
     "<HEAD>\n" 
     "<TITLE>My page</TITLE>\n" 
     "<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=utf-8\">\n" 
     "</HEAD>\n" 
     "<BODY LINK=\"#0000ff\" VLINK=\"#800080\" BGCOLOR=\"#ffffff\">\n" 
     "<P> </P>\n" 
     "<PRE>\n"; 

en algo más legible (no exactamente la misma debido a los espacios en la segunda variante, pero perfectamente bien para HTML ya que ignora los espacios añadidos en este caso):

htmlString = R"xyzzy(
    <HTML> 
     <HEAD> 
     <TITLE>My page</TITLE> 
     <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8"> 
     </HEAD> 
     <BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#ffffff"> 
     <P> </P> 
     <PRE> 
    )xyzzy"; 
+0

Esto es antiguo, pero se supone que es 'R" (.. .) "' en su último ejemplo, y probablemente no debería tener una barra invertida ya que es una cadena sin formato. – Rapptz

+0

La primera versión escrita no tendrá la sangría que muestra la segunda versión. Puede mover todas las comillas izquierdas en la versión antigua a la izquierda para acumular espacio en blanco si desea una sangría. Las cadenas sin formato son más fáciles de resolver. – emsr

4

C++ 11 agrega raw literales de cadena que son al menos algo similares.

R"(This is a raw literal)"; 

Estos son particularmente útiles para expresiones regulares, como:

R"@(\w+\d*)@" 

... lo que haría, como un literal tradicional sería:

"\\w+\\d*" 

Aunque la diferencia no es muy grande , puede hacer una diferencia, especialmente en una expresión regular más larga.

+0

El delimitador '@' debe estar dentro de las comillas. – user362515

+0

@ user362515: Oops: increíble cómo un error tipográfico puede sobrevivir durante casi 4 años cuando no se ejecuta a través de un compilador ... –

0

Here es un ejemplo de literales de cadena sin formato (C++ 11).

Las líneas nuevas y las barras diagonales inversas aparecen literalmente.

Cuestiones relacionadas