2010-10-04 12 views
51

Da non confondere con il modo di dividere una stringa parsing saggio, ad esempio:
Split a string in C++?Splitting C++ Strings su più righe (Codice della sintassi, non di analisi)

Sono un po 'confuso su come dividere una stringa su più righe in C++.

Questo suona come una domanda semplice, ma prendere il seguente esempio:

#include <iostream> 
#include <string> 
main() { 
    //Gives error 
    std::string my_val ="Hello world, this is an overly long string to have" + 
    " on just one line"; 
    std::cout << "My Val is : " << my_val << std::endl; 

    //Gives error 
    std::string my_val ="Hello world, this is an overly long string to have" & 
    " on just one line"; 
    std::cout << "My Val is : " << my_val << std::endl; 
} 

mi rendo conto che avrei potuto utilizzare il metodo std::stringappend(), ma mi chiedevo se ci fosse più breve/più elegante (ad esempio, più pythonlike, anche se ovviamente citazioni triple ecc non sono supportate in C++) modo per rompere stringhe in C++ su più righe per ragioni di leggibilità.

Un posto in cui ciò sarebbe particolarmente desiderabile è quando si sta passando lunghe stringhe a una funzione (ad esempio una frase).

+2

Ecco un piccolo bocconcino interessante: il lexer C++ non si interessa di quante virgolette si posizionano prima e dopo una stringa con solo due eccezioni. Il numero di citazioni che usi deve essere dispari e devono corrispondere su entrambi i lati. '" "" "" Questa è una stringa valida e verrà analizzata "" "" "'. Tuttavia, non ci sono proprietà speciali dati a queste stringhe, si comportano semplicemente come virgolette singole. –

+0

Interessante grazie per aver condiviso che ... c'è qualche scopo utile per questo? Potreste essere in grado di utilizzarlo come un tag sottile per i diversi gruppi di stringhe in un codice per l'analisi esterni dagli script perl/bash/Python. Questo è tutto ciò a cui riesco a pensare per ora. :) –

+0

@ThomasAnthony Questo succede solo perché tratterà le virgolette intorno alla fine come un gruppo di stringhe vuote e le concatenerà insieme - non è una caratteristica, è il comportamento standard C/C++ – texasflood

risposta

88

Non mettere nulla tra le corde. Parte dello stage di lexing in C++ consiste nel combinare letterali stringa adiacenti (anche su newline e commenti) in un singolo letterale.

#include <iostream> 
#include <string> 
main() { 
    std::string my_val ="Hello world, this is an overly long string to have" 
    " on just one line"; 
    std::cout << "My Val is : " << my_val << std::endl; 
} 

Si noti che se si vuole un ritorno a capo nel letterale, si dovrà aggiungere che da soli:

#include <iostream> 
#include <string> 
main() { 
    std::string my_val ="This string gets displayed over\n" 
    "two lines when sent to cout."; 
    std::cout << "My Val is : " << my_val << std::endl; 
} 

Se si vogliono mescolare un #define d intero costante nel letterale, è' ll deve utilizzare alcune macro:

#include <iostream> 
using namespace std; 

#define TWO 2 
#define XSTRINGIFY(s) #s 
#define STRINGIFY(s) XSTRINGIFY(s) 

int main(int argc, char* argv[]) 
{ 
    std::cout << "abc" // Outputs "abc2DEF" 
     STRINGIFY(TWO) 
     "DEF" << endl; 
    std::cout << "abc" // Outputs "abcTWODEF" 
     XSTRINGIFY(TWO) 
     "DEF" << endl; 
} 

c'è qualche stranezza in là a causa del modo in cui l'operatore del processore stringa i funziona, quindi è necessario due livelli di macro per ottenere il valore reale del TWO da trasformare in una stringa letterale.

+0

Puoi mescolare altri elementi come una costante int ? Se no, come posso aggiungerli? –

+0

@Jason: cosa intendi mescolando in una costante int? – Eclipse

+0

my_function (arg_1, arg_2, "ciao mondo questa stringa è" DUE "righe lunghe!"); –

8

Sono tutte e due letterali? Separa due stringhe con spazi è la stessa concatenazione: "abc" "123" è lo stesso "abc123". Questo vale per C dritto e C++.

+0

Ahhh così semplice. Grazie! –

4

Non so se è un'estensione in GCC o se è standard, ma sembra che tu possa continuare una stringa letterale terminando la riga con una barra rovesciata (proprio come la maggior parte dei tipi di linee può essere estesa in questo manor in C++, ad esempio una macro che si estende su più righe).

#include <iostream> 
#include <string> 

int main() 
{ 
    std::string str = "hello world\ 
    this seems to work"; 

    std::cout << str; 
    return 0; 
} 
+3

Questa sintassi letterale contiene un bel po 'di spazi vuoti tra 'world' e' this' – SingleNegationElimination

+0

@TokenMacGuy: anzi, non l'avevo notato. Abbastanza facile da risolvere se si sposta la seconda (e successive) linee completamente a sinistra. Ma questo potrebbe davvero rovinare l'aspetto del tuo rientro. – rmeador

+0

Sì, questo era il mio approccio iniziale, ma l'ho abbandonato a causa dei problemi relativi all'indentazione/spaziatura @SingleNegationElimination. Buono a notare però. –