resueltos programas funciones ejercicios ejemplos codigos clases caracteres cadenas avanzados c++ string syntax coding-style readability

programas - División de cadenas de C++ en múltiples líneas(sintaxis de código, no de análisis)



funciones de cadenas de caracteres en c++ (3)

¿Son ambos literales? Separar dos literales de cadena con espacios en blanco es lo mismo que concatenación: "abc" "123" es lo mismo que "abc123" . Esto se aplica tanto a C como a C ++.

No debe confundirse con la forma de dividir una cadena de análisis, por ejemplo:
Dividir una cadena en C ++?

Estoy un poco confundido sobre cómo dividir una cadena en múltiples líneas en c ++.

Esto suena como una pregunta simple, pero tome el siguiente ejemplo:

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

Me di cuenta de que podía usar el método std::string append() , pero me preguntaba si había alguna forma más corta / más elegante (por ejemplo, más parecida a python, aunque obviamente triple, etc., no admitida en c ++) para romper cadenas en c ++ en múltiples líneas para mayor legibilidad.

Un lugar donde esto sería particularmente deseable es cuando está pasando literales de cadena largos a una función (por ejemplo, una oración).


No coloque nada entre las cuerdas. Parte de la etapa lexing de C ++ es combinar literales de cadena adyacentes (incluso sobre líneas nuevas y comentarios) en un solo literal.

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

Tenga en cuenta que si quiere una nueva línea en el literal, tendrá que agregarla usted mismo:

#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 quiere mezclar una constante #define d en el literal, tendrá que usar algunas 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; }

Hay algunas rarezas debido a la forma en que funciona el operador del procesador de cadenas, por lo que necesita dos niveles de macro para obtener el valor real de TWO para convertirlo en un literal de cadena.


No sé si es una extensión en GCC o si es estándar, pero parece que puede continuar un literal de cadena al terminar la línea con una barra diagonal inversa (al igual que la mayoría de los tipos de líneas se pueden extender en este señorío en C ++, por ejemplo, una macro que abarca múltiples líneas).

#include <iostream> #include <string> int main () { std::string str = "hello world/ this seems to work"; std::cout << str; return 0; }