How to concatenate a std::string and an int?
我认为这很简单,但也带来了一些困难。如果我有
1 2 | std::string name ="John"; int age = 21; |
如何将它们组合成一个单字符串
按字母顺序:
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中,可以使用EDCOX1×10,例如:
1 | auto result = name + std::to_string( age ); |
如果有boost,可以使用
另一种方法是使用StringStreams:
1 2 3 | std::stringstream ss; ss << age; std::cout << name << ss.str() << std::endl; |
第三种方法是使用C库中的
1 2 3 | char buffer[128]; snprintf(buffer, sizeof(buffer),"%s%d", name.c_str(), age); std::cout << buffer << std::endl; |
其他海报建议使用
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 |
在我看来,最简单的答案是使用
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]
这个问题可以用很多方法来解决。我将以两种方式展示它:
使用
使用字符串流。
代码:
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; } |
如果要使用
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()。
这很糟糕。这里指出,
可以使用更多选项将整数(或其他数字对象)与字符串连接起来。它是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库的作者。