关于c ++:如何连接std :: string和int?

How to concatenate a std::string and an int?

我认为这很简单,但也带来了一些困难。如果我有

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

如何将它们组合成一个单字符串"John21"


按字母顺序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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);
  • 是安全的,但速度慢;需要升压(仅报头);大多数/所有平台
  • 是安全的,要求C++ 11(ToStrug())已经包含在EDCOX1(6)中)
  • 安全、快速;需要FASTFALSE,必须编译;大多数/所有平台
  • 安全、快速;需要FASTFALSE,必须编译;大多数/所有平台
  • 安全和快速;需要{fMt}库,它可以编译或使用在只头模式中;大多数/所有平台
  • 安全、慢速和冗长;要求EDCOX1〔7〕(来自标准C++)
  • 是易碎的(您必须提供足够大的缓冲区),快速和冗长;ITOA()是非标准的扩展,并且不保证对所有平台都可用。
  • 是易碎的(您必须提供足够大的缓冲区),快速和冗长;不需要任何(标准C++);所有平台
  • 是脆弱的(必须提供足够大的缓冲区),可能是最快的转换,冗长;需要stlsoft(仅头);大多数/所有平台
  • safe ish(在一条语句中不使用多个in t-to-string()调用),fast;需要stlsoft(仅限header);仅限windows
  • 安全,但速度慢;需要POCO C++;大多数/所有平台

  • 在C++ 11中,可以使用EDCOX1×10,例如:

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

    如果有boost,可以使用boost::lexical_cast(age)将整数转换为字符串。

    另一种方法是使用StringStreams:

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

    第三种方法是使用C库中的sprintfsnprintf

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

    其他海报建议使用itoa。这不是一个标准函数,因此如果使用它,代码将不可移植。有些编译器不支持它。


    1
    2
    3
    4
    5
    6
    #include <iostream>
    #include <sstream>

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


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #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上被盗。


    这是最简单的方法:

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


    如果你有C++ 11,你可以使用EDCOX1 10。

    例子:

    1
    2
    3
    4
    5
    6
    std::string name ="John";
    int age = 21;

    name += std::to_string(age);

    std::cout << name;

    输出:

    1
    John21


    在我看来,最简单的答案是使用sprintf函数:

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


    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <string>
    #include <sstream>
    using namespace std;
    string concatenate(std::string const& name, int i)
    {
        stringstream s;
        s << name << i;
        return s.str();
    }


    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <sstream>

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

    那么你的用法应该是这样的

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

    谷歌搜索[并测试:p]


    这个问题可以用很多方法来解决。我将以两种方式展示它:

  • 使用to_string(i)将数字转换为字符串。

  • 使用字符串流。

    代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    #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;
    }

  • 如果要使用+来连接任何具有输出运算符的内容,可以提供operator+的模板版本:

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

    然后您可以直接编写连接:

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

    输出:

    1
    the answer is 42

    这不是最有效的方法,但是你不需要最有效的方法,除非你在一个循环中做了大量的连接。


    如果您使用的是MFC,则可以使用CString

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

    托管C++也有一个字符串格式化程序。


    std::ostringstream是一种好方法,但有时这种额外的技巧可以方便地将格式转换为一行程序:

    1
    2
    3
    4
    5
    6
    #include <sstream>
    #define MAKE_STRING(tokens) /****************/ \
        static_cast<std::ostringstream&>(          \
            std::ostringstream().flush() << tokens \
        ).str()                                    \
        /**/

    现在您可以这样格式化字符串:

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


    由于与qt相关的一个问题已经结束了,因此下面介绍了如何使用qt:

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

    字符串变量现在有someintvariable的值来代替%1,而someotherintvariable的值在末尾。


    常见答案:ITOA()。

    这很糟糕。这里指出,itoa是非标准的。


    可以使用更多选项将整数(或其他数字对象)与字符串连接起来。它是Boost.Format。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <boost/format.hpp>
    #include <string>
    int main()
    {
        using boost::format;

        int age = 22;
        std::string str_age = str(format("age is %1%") % age);
    }

    和来自提升的业力。精神(2)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #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;
    }

    提升。灵性业力声称是整数到字符串转换的最快选择之一。


    • 标准::ostringstream
    1
    2
    3
    4
    5
    #include <sstream>

    std::ostringstream s;
    s <<"John" << age;
    std::string query(s.str());
    • STD::(C++ 11)
    1
    std::string query("John" + std::to_string(age));
    • Boost::词法转换
    1
    2
    3
    #include <boost/lexical_cast.hpp>

    std::string query("John" + boost::lexical_cast<std::string>(age));

    我编写了一个函数,它以int数字作为参数,并将其转换为字符串文字。此函数依赖于另一个将单个数字转换为等效字符的函数:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    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;
    }


    下面是如何使用iostreams库中的解析和格式化方面将int附加到字符串的实现。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    #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
    }

    您可以使用下面给出的简单技巧将int连接到字符串,但请注意,这仅在整数为单个数字时有效。否则,将整数位逐位添加到该字符串中。

    1
    2
    3
    4
    5
    6
    7
    string name ="John";
    int age = 5;
    char temp = 5 + '0';
    name = name + temp;
    cout << name << endl;

    Output:  John5

    使用fmt库:

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

    建议将库的一个子集作为p0645文本格式进行标准化,如果接受,上述内容将变为:

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

    免责声明:我是fmt库的作者。