66 votes

Fractionnement de chaînes C ++ sur plusieurs lignes (syntaxe de code, pas d'analyse)

À ne pas confondre avec comment scinder une chaîne d'analyse sage, par exemple:
http://stackoverflow.com/questions/236129/how-to-split-a-string

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

Cela ressemble à une simple question, mais prenons 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 pouvais utiliser l' std::string append() méthode, mais je me demandais si il y avait un plus court/plus élégant (par exemple, plus pythonlike, bien évidemment, entre guillemets triples etc. ne sont pas pris en charge en c++) de manière à briser les chaînes de caractères en c++ sur plusieurs lignes pour des raisons de lisibilité.

Un lieu où il serait particulièrement souhaitable, c'est quand vous êtes de passage à long littéraux de chaîne à une fonction (par exemple une phrase).

107voto

Eclipse Points 27662

Ne rien mettre entre les cordes. Une partie du C++ lexing étape est de combiner adjacentes littéraux de chaîne (même avec des retours à la ligne et les commentaires) en un seul 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 un retour à la ligne dans le sens littéral, vous devez ajouter 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 êtes désireux de mélanger #defined constante entière dans le littéral, vous devrez utiliser les 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 une certaine étrangeté dans en raison de la façon dont le stringify processeur opérateur fonctionne, si vous avez besoin de deux niveaux de macro pour obtenir la valeur réelle de l' TWO d'être une chaîne littérale.

9voto

mkb Points 7558

Sont-ils tous deux littéraux? La séparation de deux littéraux de chaîne avec des espaces est identique à la concaténation: "abc" "123" est identique à "abc123" . Ceci s’applique aussi bien au C qu’au C ++.

4voto

rmeador Points 15107

Je ne sais pas s'il s'agit d'une extension dans GCC ou si elle est standard, mais il semble que vous pouvez continuer un littéral de chaîne en terminant la ligne par une barre oblique inversée (tout comme la plupart des types de lignes peuvent être étendus 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;
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X