Как объединить std :: string и int? - PullRequest
611 голосов
/ 10 октября 2008

Я думал, что это будет действительно просто, но это создает некоторые трудности. Если у меня есть

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

Как мне объединить их, чтобы получить одну строку "John21"?

Ответы [ 22 ]

1035 голосов
/ 23 мая 2009

В алфавитном порядке:

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. безопасно, но медленно; требуется Boost (только для заголовка); большинство / все платформы
  2. безопасно, требуется C ++ 11 ( to_string () уже включено в #include <string>)
  3. безопасно и быстро; требует FastFormat , который должен быть скомпилирован; большинство / все платформы
  4. безопасно и быстро; требует FastFormat , который должен быть скомпилирован; большинство / все платформы
  5. безопасно и быстро; требует библиотеки {fmt} , которую можно скомпилировать или использовать в режиме только заголовка; большинство / все платформы
  6. безопасный, медленный и многословный; требуется #include <sstream> (из стандарта C ++)
  7. хрупкий (вы должны предоставить достаточно большой буфер), быстрый и многословный; itoa () является нестандартным расширением и не гарантируется, что оно будет доступно для всех платформ
  8. хрупкий (вы должны предоставить достаточно большой буфер), быстрый и многословный; ничего не требует (стандарт C ++); все платформы
  9. хрупкий (вы должны предоставить достаточно большой буфер), вероятно самое быстрое преобразование , многословно; требуется STLSoft (только заголовок); большинство / все платформы
  10. safe-ish (вы не используете более одного int_to_string () в одном выражении), быстро; требуется STLSoft (только заголовок); Окна-только
  11. безопасно, но медленно; требуется Poco C ++ ; большинство / все платформы
247 голосов
/ 08 августа 2012

В C ++ 11 вы можете использовать std::to_string, например ::

auto result = name + std::to_string( age );
81 голосов
/ 10 октября 2008

Если у вас есть Boost, вы можете преобразовать целое число в строку, используя boost::lexical_cast<std::string>(age).

Другой способ - использовать струны:

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

Третий подход - использовать sprintf или snprintf из библиотеки C.

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

Другие авторы предложили использовать itoa. Это НЕ стандартная функция, поэтому ваш код не будет переносимым, если вы его используете. Есть компиляторы, которые его не поддерживают.

73 голосов
/ 10 октября 2008
#include <iostream>
#include <sstream>

std::ostringstream o;
o << name << age;
std::cout << o.str();
50 голосов
/ 10 октября 2008
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
string itos(int i) // convert int to string
{
    stringstream s;
    s << i;
    return s.str();
}

Бесстыдно похищен из http://www.research.att.com/~bs/bs_faq2.html.

28 голосов
/ 22 декабря 2014

Это самый простой способ:

string s = name + std::to_string(age);
22 голосов
/ 28 мая 2013

Если у вас есть C ++ 11, вы можете использовать std::to_string.

Пример:

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

name += std::to_string(age);

std::cout << name;

Выход:

John21
18 голосов
/ 10 октября 2008

Мне кажется, что самый простой ответ - использовать функцию sprintf:

sprintf(outString,"%s%d",name,age);
15 голосов
/ 10 октября 2008
#include <string>
#include <sstream>
using namespace std;
string concatenate(std::string const& name, int i)
{
    stringstream s;
    s << name << i;
    return s.str();
}
11 голосов
/ 10 октября 2008
#include <sstream>

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

Тогда ваше использование будет выглядеть примерно так

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

Погуглил [и проверено: p]

...