Pregunta Cómo concatenar una std :: string y un int?


Pensé que esto sería realmente simple pero presenta algunas dificultades. Si tengo

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

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


562
2017-10-10 15:05


origen


Respuestas:


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 (requires #include <sstream>)
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 Aumentar (solo encabezado); la mayoría / todas las plataformas
  2. es seguro, requiere C ++ 11 (Encadenar() 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 puede ser compilado o utilizado en un modo de solo encabezado; la mayoría / todas las plataformas
  6. seguro, lento y detallado; requiere #include <sstream> (del estándar C ++)
  7. es frágil (debe proporcionar un búfer lo suficientemente grande), rápido y detallado; itoa () es una extensión no estándar, y no está garantizado que esté disponible para todas las plataformas
  8. es frágil (debe proporcionar un búfer lo suficientemente grande), rápido y detallado; no requiere nada (es estándar C ++); todas las plataformas
  9. es frágil (debe suministrar un buffer lo suficientemente grande), probablemente la conversión más rápida posible, verboso; requiere STLSoft (solo encabezado); la mayoría / todas las plataformas
  10. seguro-ish (no usas más de uno int_to_string () llamar en una sola declaración), rápido; requiere STLSoft (solo encabezado); Solo para Windows
  11. es seguro, pero lento; requiere Poco C ++ ; la mayoría / todas las plataformas

947
2018-05-22 21:16



En C ++ 11, puedes usar std::to_string, p.ej.:

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

234
2017-08-08 08:17



Si tiene Boost, puede convertir el 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 usar sprintf o snprintf de la biblioteca 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 admiten.


81
2017-10-10 15:11



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

71
2017-10-10 15:09



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

Desvergonzadamente robado de http://www.research.att.com/~bs/bs_faq2.html.


47
2017-10-10 15:09



Esta es la manera más fácil:

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

26
2017-12-21 21:50



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

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

19
2017-10-10 15:56



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

18
2018-05-27 21:56



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

15
2017-10-10 15:12



No tengo el karma suficiente para comentar (y mucho menos editar), pero la publicación de Jay (actualmente la más votados en 27) contiene un error. Este código:

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

Hace no resuelve el problema establecido de crear una cadena que consiste en una cadena concatenada y un entero. Creo que Jay quería decir algo más como esto:

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

La última línea es solo para imprimir el resultado, y muestra cómo acceder a la cadena concatenada final.


15
2017-10-16 08:46