2012-05-09 4 views
13

Qual è l'equivalente in C++ del simbolo C# che precede le stringhe? Per far uscire automaticamente i simboli?Qual è l'equivalente in C++ del simbolo C# che precede le stringhe?

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

+1

Intende le stringhe letterali. – Mehrdad

+0

possibile duplicato di [String letterals C++?] (Http://stackoverflow.com/questions/2597322/string-literals-c) – Mehrdad

+0

@Jake - Gotcha! Grazie per il chiarimento. Il termine .Net è "letterale stringa letterale" e lo scopo è che "\" non sia considerato un carattere di escape: http://msdn.microsoft.com/en-us/library/aa691090%28v=vs 0,71% 29.aspx. Non esiste un equivalente in Java o versioni correnti di C++ (e no, io * non * considero C++ 11 una "versione corrente";)) – paulsm4

risposta

27

In C++ 11, è possibile utilizzare stringhe letterali prime:

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

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

Ecco la parola C++11 FAQ su di esso, e un reference.

8

Stai cercando la funzione "stringa raw" di C++ ma è un'aggiunta abbastanza recente (C++ 11, credo).

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

E 'documentato nel 2.14.5 String lieterals dello standard C++ 11, anche se questo tomo può essere un po' secco per voi, quindi suggerirei googling su "raw string" c++.

Così come sbarazzarsi di quelli fuga raddoppiare monstrosites come "\\\\nasbox\\sharename\\downloads\\super_sekrit_stuff", permette anche di bypassare il "aggiungendo \n caratteri e la combinazione di corde adiacenti" trucco come l'accensione:

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"; 

in qualcosa di più leggibile (non esattamente lo stesso a causa di spazi nella seconda variante, ma perfettamente bene per HTML quanto ignora gli spazi aggiunti in questo 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

Questo è vecchio ma dovrebbe essere "R" (.. .) "' nel tuo ultimo esempio, e probabilmente non dovrebbe avere una barra rovesciata poiché è una stringa non elaborata. – Rapptz

+0

La prima versione come scritta non avrà il rientro mostrato dalla seconda versione. Puoi spostare tutte le virgolette di sinistra nella versione obsoleta a sinistra per accumulare spazi bianchi se vuoi il rientro. Le stringhe Raw sono più facili da ottenere. – emsr

4

C++ 11 aggiunge valori letterali di stringa raw almeno in qualche modo simili.

R"(This is a raw literal)"; 

Questi sono particolarmente utili per le regex, come:

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

... il che, come un letterale tradizionale potrebbe essere:

"\\w+\\d*" 

Anche se la differenza non è enorme , può fare la differenza, specialmente in una regex più lunga.

+0

Il delimitatore '@' deve essere compreso tra virgolette. – user362515

+0

@ user362515: Oops: incredibile come un errore di battitura possa sopravvivere per quasi 4 anni quando non viene eseguito attraverso un compilatore ... –

0

Here è un esempio di stringhe di stringa non formattate (C++ 11).

Newlines e backslash appaiono letteralmente.