Séparer Les Chaînes C++ Sur Plusieurs Lignes (Syntaxe De Code, Pas D'Analyse)

à ne pas confondre avec la façon de fendre une corde parsing Sage, p.ex.:

Split a string in C++?

je suis un peu confus quant à la façon de découper une chaîne sur plusieurs lignes en c++.

cela ressemble à une question simple, mais prendre l'exemple suivant:

#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;
}

je me rends compte que je pourrais utiliser la méthode std::string append() , mais je me demandais s'il y avait plus court / plus élégant (par exemple plus ressemblant à un python, mais évidemment Triple guillemets, etc. ne sont pas pris en charge en c++) de façon à briser les chaînes en c++ sur plusieurs lignes pour des raisons de lisibilité.

un endroit où cela serait particulièrement souhaitable est quand vous passez de longues chaînes littérales à une fonction (par exemple une phrase).

55
demandé sur Community 2010-10-05 01:13:19

3 réponses

ne mettez rien entre les cordes. Une partie de l'étape de lexing C++ consiste à combiner les caractères littéraux des chaînes de caractères adjacentes (même au-dessus des nouvelles lignes et des commentaires) en un seul mot littéral.

#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;
}

notez que si vous voulez une nouvelle ligne dans le littéral, vous devrez ajouter que vous-même:

#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;
}

si vous voulez mélanger une constante entière #define d dans le littéral, vous devrez utiliser quelques macros:

#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;
}

il y a quelque chose de bizarre là-dedans en raison de la façon dont l'opérateur du processeur stringify fonctionne, donc vous avez besoin de deux niveaux de macro pour obtenir la valeur réelle de TWO pour être transformé en chaîne littérale.

92
répondu Eclipse 2010-10-04 21:48:03

sont-ils tous les deux littéraux? Séparer deux cordes littérales avec des espaces est la même chose que la concaténation: "abc" "123" est la même chose que "abc123" . Ceci s'applique aussi bien au C simple qu'au c++.

9
répondu mkb 2010-10-04 21:15:03

Je ne sais pas si C'est une extension dans GCC ou si c'est standard, mais il semble que vous pouvez continuer une chaîne littérale en terminant la ligne avec un antislash (tout comme la plupart des types de lignes peuvent être étendues dans ce manoir en C++, par exemple une macro couvrant plusieurs lignes).

#include <iostream>
#include <string>

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

    std::cout << str;
    return 0;
}
4
répondu rmeador 2010-10-04 22:38:49