我以为这很简单,但它却有些困难。如果我有
std::string name = "John";
int age = 21;
如何将它们合并为一个字符串"John21"
?
我以为这很简单,但它却有些困难。如果我有
std::string name = "John";
int age = 21;
如何将它们合并为一个字符串"John21"
?
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);
#include <string>
中)。#include <sstream>
。String(number)
。 - MachadoC++11中,你可以使用std::to_string
,例如:
auto result = name + std::to_string( age );
boost::lexical_cast<std::string>(age)
将整数转换成字符串。std::stringstream ss;
ss << age;
std::cout << name << ss.str() << std::endl;
第三种方法是使用C库中的sprintf
或snprintf
。
char buffer[128];
snprintf(buffer, sizeof(buffer), "%s%d", name.c_str(), age);
std::cout << buffer << std::endl;
其他海报建议使用 itoa
。这不是标准函数,因此如果您使用它,则代码将无法移植。有些编译器不支持它。
sprintf
的出现,只有snprintf
。 - David Foerster#include <iostream>
#include <sstream>
std::ostringstream o;
o << name << age;
std::cout << o.str();
#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,仅供参考。
s
是一个栈变量,调用itos
后s
的内存将被释放。s
应该从堆中分配,并在使用后进行free
,对吗? - kgbook这是最简单的方法:
string s = name + std::to_string(age);
std::to_string
。std::string name = "John";
int age = 21;
name += std::to_string(age);
std::cout << name;
输出:
John21
name += std::to_string(age + 0LL);
怎么样? - chux - Reinstate Monica我认为最简单的答案是使用sprintf
函数:
sprintf(outString,"%s%d",name,age);
#include <string>
#include <sstream>
using namespace std;
string concatenate(std::string const& name, int i)
{
stringstream s;
s << name << i;
return s.str();
}
在C++20中,您将能够执行以下操作:
auto result = std::format("{}{}", name, age);
同时,您可以使用{fmt}库,std::format
是基于该库的:
auto result = fmt::format("{}{}", name, age);
声明:本人是{fmt}库和C++20 std::format
的作者。
fmt::format(variable,name,age)
。 - Nguyen Manhfmt::runtime
将动态格式字符串包装起来。 - vitautstore.push_back(fmt::arg("1", "pi"));
,这也会抛出异常fmt::vformat("{1} = {2}",store)
。 - Nguyen ManhSYSTEMTIME t;
一起使用? fmt :: format(“ {}”,t);
请给我一个例子。谢谢! - Nguyen Manh
Boost::lexical_cast
,std::stringstream
,std::strstream
(已弃用)以及sprintf
与snprintf
的比较。 - Fred Larson