How to concatenate a std::string and an int

C++IntegerConcatenationStdstring

C++ Problem Overview


I thought this would be really simple, but it's presenting some difficulties. If I have

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

How do I combine them to get a single string "John21"?

C++ Solutions


Solution 1 - C++

In alphabetical order:

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. is safe, but slow; requires Boost (header-only); most/all platforms
  2. is safe, requires C++11 (to_string() is already included in #include <string>)
  3. is safe, and fast; requires FastFormat, which must be compiled; most/all platforms
  4. (ditto)
  5. is safe, and fast; requires the {fmt} library, which can either be compiled or used in a header-only mode; most/all platforms
  6. safe, slow, and verbose; requires #include <sstream> (from standard C++)
  7. is brittle (you must supply a large enough buffer), fast, and verbose; itoa() is a non-standard extension, and not guaranteed to be available for all platforms
  8. is brittle (you must supply a large enough buffer), fast, and verbose; requires nothing (is standard C++); all platforms
  9. is brittle (you must supply a large enough buffer), probably the fastest-possible conversion, verbose; requires STLSoft (header-only); most/all platforms
  10. safe-ish (you don't use more than one int_to_string() call in a single statement), fast; requires STLSoft (header-only); Windows-only
  11. is safe, but slow; requires Poco C++ ; most/all platforms

Solution 2 - C++

In C++11, you can use std::to_string, e.g.:

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

Solution 3 - C++

If you have Boost, you can convert the integer to a string using boost::lexical_cast<std::string>(age).

Another way is to use stringstreams:

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

A third approach would be to use sprintf or snprintf from the C library.

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

Other posters suggested using itoa. This is NOT a standard function, so your code will not be portable if you use it. There are compilers that don't support it.

Solution 4 - C++

#include <iostream>
#include <sstream>

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

Solution 5 - C++

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

Shamelessly stolen from http://www.research.att.com/~bs/bs_faq2.html.

Solution 6 - C++

This is the easiest way:

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

Solution 7 - C++

If you have C++11, you can use std::to_string.

Example:

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

name += std::to_string(age);

std::cout << name;

Output:

John21

Solution 8 - C++

It seems to me that the simplest answer is to use the sprintf function:

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

Solution 9 - C++

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

Solution 10 - C++

#include <sstream>

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

Then your usage would look something like this

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

Googled [and tested :p ]

Solution 11 - C++

This problem can be done in many ways. I will show it in two ways:

  1. Convert the number to string using to_string(i).

  2. Using string streams.

    Code:

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

Solution 12 - C++

In C++20 you'll be able to do:

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

In the meantime you can use the {fmt} library, std::format is based on:

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

Disclaimer: I'm the author of the {fmt} library and C++20 std::format.

Solution 13 - C++

If you'd like to use + for concatenation of anything which has an output operator, you can provide a template version of operator+:

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

Then you can write your concatenations in a straightforward way:

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

Output:

the answer is 42

This isn't the most efficient way, but you don't need the most efficient way unless you're doing a lot of concatenation inside a loop.

Solution 14 - C++

If you are using MFC, you can use a CString

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

Managed C++ also has a string formatter.

Solution 15 - C++

The std::ostringstream is a good method, but sometimes this additional trick might get handy transforming the formatting to a one-liner:

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

Now you can format strings like this:

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

Solution 16 - C++

As a Qt-related question was closed in favour of this one, here's how to do it using Qt:

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

The string variable now has someIntVariable's value in place of %1 and someOtherIntVariable's value at the end.

Solution 17 - C++

As a one liner: name += std::to_string(age);

Solution 18 - C++

There are more options possible to use to concatenate integer (or other numerric object) with string. It is 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);
}

and Karma from Boost.Spirit (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 claims to be one of the fastest option for integer to string conversion.

Solution 19 - C++

  • std::ostringstream

> #include >
> 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 >
> std::string query("John " + boost::lexical_cast(age));

Solution 20 - C++

Common Answer: itoa()

This is bad. itoa is non-standard, as pointed out here.

Solution 21 - C++

Here is an implementation of how to append an int to a string using the parsing and formatting facets from the IOStreams library.

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

Solution 22 - C++

You can concatenate int to string by using the given below simple trick, but note that this only works when integer is of single digit. Otherwise, add integer digit by digit to that string.

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

Output:  John5

Solution 23 - C++

There is a function I wrote, which takes the int number as the parameter, and convert it to a string literal. This function is dependent on another function that converts a single digit to its char equivalent:

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

Solution 24 - C++

In C++ 20 you can have a variadic lambda that does concatenate arbitrary streamable types to a string in a few lines:

auto make_string=[os=std::ostringstream{}](auto&& ...p) mutable 
{ 
  (os << ... << std::forward<decltype(p)>(p) ); 
  return std::move(os).str();
};

int main() {
std::cout << make_string("Hello world: ",4,2, " is ", 42.0);
}

see https://godbolt.org/z/dEe9h75eb

using move(os).str() guarantees that the ostringstream object's stringbuffer is empty next time the lambda is called.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionObediah StaneView Question on Stackoverflow
Solution 1 - C++DannyTView Answer on Stackoverflow
Solution 2 - C++JeremyView Answer on Stackoverflow
Solution 3 - C++Jay ConrodView Answer on Stackoverflow
Solution 4 - C++Ben HoffsteinView Answer on Stackoverflow
Solution 5 - C++tloachView Answer on Stackoverflow
Solution 6 - C++KevinView Answer on Stackoverflow
Solution 7 - C++David GView Answer on Stackoverflow
Solution 8 - C++user12576View Answer on Stackoverflow
Solution 9 - C++Seb RoseView Answer on Stackoverflow
Solution 10 - C++Zing-View Answer on Stackoverflow
Solution 11 - C++lohith99View Answer on Stackoverflow
Solution 12 - C++vitautView Answer on Stackoverflow
Solution 13 - C++uckelmanView Answer on Stackoverflow
Solution 14 - C++bsruthView Answer on Stackoverflow
Solution 15 - C++Pyry JahkolaView Answer on Stackoverflow
Solution 16 - C++leinirView Answer on Stackoverflow
Solution 17 - C++ant_devView Answer on Stackoverflow
Solution 18 - C++mloskotView Answer on Stackoverflow
Solution 19 - C++Isma RekathakusumaView Answer on Stackoverflow
Solution 20 - C++Tom RitterView Answer on Stackoverflow
Solution 21 - C++David GView Answer on Stackoverflow
Solution 22 - C++SukhbirView Answer on Stackoverflow
Solution 23 - C++Reda LahdiliView Answer on Stackoverflow
Solution 24 - C++PeterSomView Answer on Stackoverflow