from convertir concatenate concatenar c++ int concatenation stdstring

c++ - convertir - ¿Cómo concatenar un std:: string y un int?



int to string c++ 98 (29)

Pensé que esto sería realmente simple pero está presentando algunas dificultades. Si tengo

std::string name = "John"; int age = 21;

¿Cómo los combino para obtener una sola cadena "John21" ?


Aquí hay una implementación de cómo anexar un int a una cadena usando las facetas de análisis y formato de la biblioteca IOStreams.

#include <iostream> #include <locale> #include <string> template <class Facet> struct erasable_facet : Facet { erasable_facet() : Facet(1) { } ~erasable_facet() { } }; void append_int(std::string& s, int n) { erasable_facet<std::num_put<char, std::back_insert_iterator<std::string>>> facet; std::ios str(nullptr); facet.put(std::back_inserter(s), str, str.fill(), static_cast<unsigned long>(n)); } int main() { std::string str = "ID: "; int id = 123; append_int(str, id); std::cout << str; // ID: 123 }


Como una pregunta relacionada con Qt se cerró a favor de esta, aquí se explica cómo hacerlo utilizando Qt:

QString string = QString("Some string %1 with an int somewhere").arg(someIntVariable); string.append(someOtherIntVariable);

La variable de cadena ahora tiene el valor de someIntVariable en lugar de% 1 y el valor de someOtherIntVariable al final.


Con la biblioteca {fmt} :

auto result = fmt::format("{}{}", name, age);

Se propone un subconjunto de la biblioteca para la estandarización como Formato de texto P0645 y, si se acepta, lo anterior se convertirá en:

auto result = std::format("{}{}", name, age);

Descargo de responsabilidad : soy el autor de la biblioteca {fmt}.


En C ++ 11, puedes usar std::to_string , por ejemplo:

auto result = name + std::to_string( age );


En orden alfabético:

std::string name = "John"; int age = 21; std::string result; // 1. with Boost result = name + boost::lexical_cast<std::string>(age); // 2. with C++11 result = name + std::to_string(age); // 3. with FastFormat.Format fastformat::fmt(result, "{0}{1}", name, age); // 4. with FastFormat.Write fastformat::write(result, name, age); // 5. with the {fmt} library result = fmt::format("{}{}", name, age); // 6. with IOStreams std::stringstream sstm; sstm << name << age; result = sstm.str(); // 7. with itoa char numstr[21]; // enough to hold all numbers up to 64-bits result = name + itoa(age, numstr, 10); // 8. with sprintf char numstr[21]; // enough to hold all numbers up to 64-bits sprintf(numstr, "%d", age); result = name + numstr; // 9. with STLSoft''s integer_to_string char numstr[21]; // enough to hold all numbers up to 64-bits result = name + stlsoft::integer_to_string(numstr, 21, age); // 10. with STLSoft''s winstl::int_to_string() result = name + winstl::int_to_string(age); // 11. With Poco NumberFormatter result = name + Poco::NumberFormatter().format(age);

  1. es seguro, pero lento; requiere Boost (solo encabezado); la mayoría / todas las plataformas
  2. es seguro, requiere C ++ 11 ( to_string() ya está incluido en #include <string> )
  3. es seguro, y rápido; requiere FastFormat , que debe ser compilado; la mayoría / todas las plataformas
  4. es seguro, y rápido; requiere FastFormat , que debe ser compilado; la mayoría / todas las plataformas
  5. es seguro, y rápido; requiere la biblioteca {fmt} , que se puede compilar o usar en un modo de solo encabezado; la mayoría / todas las plataformas
  6. seguro, lento y detallado; requiere #include <sstream> (de C ++ estándar)
  7. es frágil (debe proporcionar un búfer suficientemente grande), rápido y detallado; itoa () es una extensión no estándar, y no se garantiza que esté disponible para todas las plataformas
  8. es frágil (debe proporcionar un búfer suficientemente grande), rápido y detallado; no requiere nada (es estándar C ++); todas las plataformas
  9. es frágil (debe proporcionar un búfer suficientemente grande), probablemente la conversión más rápida posible , detallada; requiere STLSoft (solo encabezado); la mayoría / todas las plataformas
  10. safe-ish (no usa más de una llamada int_to_string () en una sola declaración), rápido; requiere STLSoft (solo encabezado); Solo para Windows
  11. es seguro, pero lento; requiere Boost ; la mayoría / todas las plataformas

Esta es la manera más fácil:

string s = name + std::to_string(age);


Este problema se puede hacer de muchas maneras. Lo mostraré de dos maneras:

  1. Convierta el número en una cadena usando to_string (i).

  2. Utilizando secuencias de cadena.

    Código:

    #include <string> #include <sstream> #include <bits/stdc++.h> #include <iostream> using namespace std; int main() { string name = "John"; int age = 21; string answer1 = ""; // Method 1). string s1 = to_string(age). string s1=to_string(age); // Know the integer get converted into string // where as we know that concatenation can easily be done using ''+'' in C++ answer1 = name + s1; cout << answer1 << endl; // Method 2). Using string streams ostringstream s2; s2 << age; string s3 = s2.str(); // The str() function will convert a number into a string string answer2 = ""; // For concatenation of strings. answer2 = name + s3; cout << answer2 << endl; return 0; }

// Espero eso ayude


Hay más opciones posibles de usar para concatenar enteros (u otro objeto numérico) con una cadena. Es Boost.Format

#include <boost/format.hpp> #include <string> int main() { using boost::format; int age = 22; std::string str_age = str(format("age is %1%") % age); }

y Karma de Boost . Espíritu (v2)

#include <boost/spirit/include/karma.hpp> #include <iterator> #include <string> int main() { using namespace boost::spirit; int age = 22; std::string str_age("age is "); std::back_insert_iterator<std::string> sink(str_age); karma::generate(sink, int_, age); return 0; }

Boost.Spirit Karma afirma ser una de las opciones más rápidas para la conversión de enteros a cadenas .


Hay una función que escribí, que toma el número int como parámetro y lo convierte en un literal de cadena. Esta función depende de otra función que convierte un solo dígito a su equivalente de caracteres:

char intToChar(int num) { if (num < 10 && num >= 0) { return num + 48; //48 is the number that we add to an integer number to have its character equivalent (see the unsigned ASCII table) } else { return ''*''; } } string intToString(int num) { int digits = 0, process, single; string numString; process = num; // The following process the number of digits in num while (process != 0) { single = process % 10; // ''single'' now holds the rightmost portion of the int process = (process - single)/10; // Take out the rightmost number of the int (it''s a zero in this portion of the int), then divide it by 10 // The above combination eliminates the rightmost portion of the int digits ++; } process = num; // Fill the numString with ''*'' times digits for (int i = 0; i < digits; i++) { numString += ''*''; } for (int i = digits-1; i >= 0; i--) { single = process % 10; numString[i] = intToChar ( single); process = (process - single) / 10; } return numString; }


Herb Sutter tiene un buen artículo sobre este tema: "The String Formatters of Manor Farm" . Cubre Boost::lexical_cast , std::stringstream , std::strstream (que está en desuso), y sprintf contra snprintf .


La respuesta detallada está oculta en otras respuestas, resurgiendo parte de ella:

#include <iostream> // cout #include <string> // string, to_string(some_number_here) using namespace std; int main() { // using constants cout << "John" + std::to_string(21) << endl; // output is: // John21 // using variables string name = "John"; int age = 21; cout << name + to_string(age) << endl; // output is: // John21 }


Me parece que la respuesta más simple es usar la función sprintf :

sprintf(outString,"%s%d",name,age);


Otra forma fácil de hacerlo es:

name.append(age+""); cout << name;


Puede concatenar int para encadenar usando el simple truco dado a continuación, pero tenga en cuenta que esto solo funciona cuando el número entero es de un solo dígito. De lo contrario, agregue dígitos enteros por dígitos a esa cadena.

string name = "John"; int age = 5; char temp = 5 + ''0''; name = name + temp; cout << name << endl; Output: John5


Respuesta común: itoa()

Esto es malo. itoa no es estándar, como se señala here .


Si desea obtener una char * out, y ha usado stringstream según lo que los encuestados anteriores han descrito, entonces, por ejemplo:

myFuncWhichTakesPtrToChar(ss.str().c_str());

Dado que lo que devuelve la cadena de caracteres a través de str () es una cadena estándar, puede llamar a c_str () para obtener el tipo de salida deseado.


Si desea utilizar + para la concatenación de cualquier cosa que tenga un operador de salida, puede proporcionar una versión de plantilla de operator+ :

template <typename L, typename R> std::string operator+(L left, R right) { std::ostringstream os; os << left << right; return os.str(); }

Entonces puedes escribir tus concatenaciones de una manera directa:

std::string foo("the answer is "); int i = 42; std::string bar(foo + i); std::cout << bar << std::endl;

Salida:

the answer is 42

Esta no es la forma más eficiente, pero no necesita la forma más eficiente a menos que esté haciendo mucha concatenación dentro de un bucle.


Si está usando MFC, puede usar un CString

CString nameAge = ""; nameAge.Format("%s%d", "John", 21);

Managed C ++ también tiene un formateador de cadenas .


Si tiene C ++ 11, puede usar std::to_string .

Ejemplo:

std::string name = "John"; int age = 21; name += std::to_string(age); std::cout << name;

Salida:

John21


Si tienes Boost, puedes convertir el número entero en una cadena usando boost::lexical_cast<std::string>(age) .

Otra forma es usar stringstreams:

std::stringstream ss; ss << age; std::cout << name << ss.str() << std::endl;

Un tercer enfoque sería utilizar sprintf o snprintf de la biblioteca de C.

char buffer[128]; snprintf(buffer, sizeof(buffer), "%s%d", name.c_str(), age); std::cout << buffer << std::endl;

Otros carteles sugirieron usar itoa . Esta NO es una función estándar, por lo que su código no será portátil si lo usa. Hay compiladores que no lo soportan.


Sin C ++ 11, para un pequeño rango de enteros, encontré que esto es todo lo que necesitaba:

Declare / incluya alguna variante de lo siguiente en algún lugar:

const string intToString[10] = {"0","1","2","3","4","5","6","7","8","9"};

Entonces:

string str = intToString[3] + " + " + intToString[4] + " = " + intToString[7]; //str equals "3 + 4 = 7"

Funciona con enumeraciones también.


Soy un usuario principiante de C ++ y encontré esto de la manera más fácil:

cout << name << age;

Esto concatenará con éxito el nombre y la edad, la salida será "John21".

Sin embargo, tiene que haber una razón por la cual nadie dijo esto; Creo que puede haber una falla en ella, aunque no la he experimentado hasta ahora.

EDITAR: Me he dado cuenta de que esta no es necesariamente la respuesta correcta, sin embargo, la mantendré aquí en caso de que algún principiante de C ++ quiera saber cómo generar cadenas concatenadas.


Std :: ostringstream es un buen método, pero a veces este truco adicional puede ser útil para transformar el formato en una sola línea:

#include <sstream> #define MAKE_STRING(tokens) /****************/ / static_cast<std::ostringstream&>( / std::ostringstream().flush() << tokens / ).str() / /**/

Ahora puedes formatear cadenas como esta:

int main() { int i = 123; std::string message = MAKE_STRING("i = " << i); std::cout << message << std::endl; // prints: "i = 123" }


Sugerir una solución alternativa para personas como yo que pueden no tener acceso a C ++ 11 y bibliotecas / encabezados adicionales como impulso. Una simple conversión funciona así:

Por ejemplo, el número es 4, para convertir 3 en ascii simplemente podemos usar el código:
char a = ''0'' + 4

Esto almacenará inmediatamente 4 como un personaje en a.

Desde aquí, podemos simplemente concatenar a con el resto de la cadena.


#include <iostream> #include <string> #include <sstream> using namespace std; string itos(int i) // convert int to string { stringstream s; s << i; return s.str(); }

Robado descaradamente de http://www.research.att.com/~bs/bs_faq2.html .


#include <sstream> template <class T> inline std::string to_string (const T& t) { std::stringstream ss; ss << t; return ss.str(); }

Entonces su uso se vería algo como esto

std::string szName = "John"; int numAge = 23; szName += to_string<int>(numAge); cout << szName << endl;

Googled [y probado: p]


#include <string> #include <sstream> using namespace std; string concatenate(std::string const& name, int i) { stringstream s; s << name << i; return s.str(); }


std::ostringstream o; o << name << age; std::cout << o.str();


  • std :: ostringstream

#include <sstream> std::ostringstream s; s << "John " << age; std::string query(s.str());

  • std :: to_string (C ++ 11)

std::string query("John " + std::to_string(age));

  • boost :: lexical_cast

#include <boost/lexical_cast.hpp> std::string query("John " + boost::lexical_cast<std::string>(age));