Saya pikir ini akan sangat sederhana tetapi menghadirkan beberapa kesulitan. Jika saya punya
std::string name = "John";
int age = 21;
Bagaimana cara menggabungkannya untuk mendapatkan satu string "John21"
?
Saya pikir ini akan sangat sederhana tetapi menghadirkan beberapa kesulitan. Jika saya punya
std::string name = "John";
int age = 21;
Bagaimana cara menggabungkannya untuk mendapatkan satu string "John21"
?
Jawaban:
Dalam urutan abjad:
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>
(dari standar C ++)String(number)
.
Di C ++ 11, Anda dapat menggunakan std::to_string
, misalnya:
auto result = name + std::to_string( age );
Jika Anda memiliki Peningkatan, Anda dapat mengonversi bilangan bulat menjadi string menggunakan boost::lexical_cast<std::string>(age)
.
Cara lain adalah dengan menggunakan stringstreams:
std::stringstream ss;
ss << age;
std::cout << name << ss.str() << std::endl;
Pendekatan ketiga adalah menggunakan sprintf
atau snprintf
dari perpustakaan C.
char buffer[128];
snprintf(buffer, sizeof(buffer), "%s%d", name.c_str(), age);
std::cout << buffer << std::endl;
Poster lain disarankan untuk digunakan itoa
. Ini BUKAN fungsi standar, jadi kode Anda tidak akan portabel jika Anda menggunakannya. Ada kompiler yang tidak mendukungnya.
sprintf
jawaban snprintf
.
#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();
}
Tanpa malu-malu dicuri dari http://www.research.att.com/~bs/bs_faq2.html .
s
adalah variabel tumpukan, memori s
akan bebas setelah dipanggil itos
. s
harus mengalokasikan dari tumpukan, dan free
setelah menggunakan, kan?
Ini cara termudah:
string s = name + std::to_string(age);
Jika Anda memiliki C ++ 11, Anda dapat menggunakan std::to_string
.
Contoh:
std::string name = "John";
int age = 21;
name += std::to_string(age);
std::cout << name;
Keluaran:
John21
name += std::to_string(age + 0LL);
bukan?
Sepertinya saya bahwa jawaban yang paling sederhana adalah menggunakan sprintf
fungsi:
sprintf(outString,"%s%d",name,age);
#include <sstream>
template <class T>
inline std::string to_string (const T& t)
{
std::stringstream ss;
ss << t;
return ss.str();
}
Maka penggunaan Anda akan terlihat seperti ini
std::string szName = "John";
int numAge = 23;
szName += to_string<int>(numAge);
cout << szName << endl;
Dicari Google [dan diuji: p]
Masalah ini dapat dilakukan dengan banyak cara. Saya akan menunjukkannya dalam dua cara:
Konversi angka menjadi string menggunakan to_string(i)
.
Menggunakan aliran string.
Kode:
#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;
}
Jika Anda ingin menggunakan +
untuk penggabungan apa pun yang memiliki operator keluaran, Anda dapat memberikan versi templat dari operator+
:
template <typename L, typename R> std::string operator+(L left, R right) {
std::ostringstream os;
os << left << right;
return os.str();
}
Kemudian Anda dapat menulis rangkaian Anda dengan mudah:
std::string foo("the answer is ");
int i = 42;
std::string bar(foo + i);
std::cout << bar << std::endl;
Keluaran:
the answer is 42
Ini bukan cara yang paling efisien, tetapi Anda tidak perlu cara yang paling efisien kecuali Anda melakukan banyak penggabungan di dalam satu lingkaran.
std::string
, jadi tidak akan menjadi kandidat dalam ekspresi di mana string tidak dapat dikonversi menjadi tipe yang diperlukan. Misalnya, ini operator+
tidak memenuhi syarat untuk digunakan +
dalam int x = 5 + 7;
. Semua hal dipertimbangkan, saya tidak akan mendefinisikan operator seperti ini tanpa alasan yang sangat menarik, tetapi tujuan saya adalah untuk menawarkan jawaban yang berbeda dari yang lain.
Jika Anda menggunakan MFC, Anda dapat menggunakan CString
CString nameAge = "";
nameAge.Format("%s%d", "John", 21);
Managed C ++ juga memiliki formatter string .
Std :: ostringstream adalah metode yang bagus, tetapi terkadang trik tambahan ini berguna mengubah format menjadi satu-liner:
#include <sstream>
#define MAKE_STRING(tokens) /****************/ \
static_cast<std::ostringstream&>( \
std::ostringstream().flush() << tokens \
).str() \
/**/
Sekarang Anda dapat memformat string seperti ini:
int main() {
int i = 123;
std::string message = MAKE_STRING("i = " << i);
std::cout << message << std::endl; // prints: "i = 123"
}
Karena pertanyaan terkait Qt ditutup untuk pertanyaan ini, berikut ini cara melakukannya menggunakan Qt:
QString string = QString("Some string %1 with an int somewhere").arg(someIntVariable);
string.append(someOtherIntVariable);
Variabel string sekarang memiliki nilai someIntVariable di tempat% 1 dan nilai someOtherIntVariable di akhir.
Ada lebih banyak opsi yang dapat digunakan untuk menggabungkan bilangan bulat (atau objek numerik lainnya) dengan string. Ini adalah 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);
}
dan Karma dari 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 mengklaim sebagai salah satu opsi tercepat untuk konversi integer ke string .
Anda dapat menggabungkan int ke string dengan menggunakan trik sederhana yang diberikan di bawah ini, tetapi perhatikan bahwa ini hanya berfungsi ketika integer adalah dari satu digit. Jika tidak, tambahkan angka integer demi digit ke string itu.
string name = "John";
int age = 5;
char temp = 5 + '0';
name = name + temp;
cout << name << endl;
Output: John5
Berikut ini adalah implementasi cara menambahkan int ke string menggunakan aspek parsing dan format dari pustaka IOStreams.
#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
}
#include <sstream> std::ostringstream s; s << "John " << age; std::string query(s.str());
std::string query("John " + std::to_string(age));
#include <boost/lexical_cast.hpp> std::string query("John " + boost::lexical_cast<std::string>(age));
Ada fungsi yang saya tulis, yang mengambil nomor int sebagai parameter, dan mengubahnya menjadi string literal. Fungsi ini tergantung pada fungsi lain yang mengubah satu digit ke karakternya:
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;
}
Dengan perpustakaan {fmt} :
auto result = fmt::format("{}{}", name, age);
Subset perpustakaan diusulkan untuk standardisasi sebagai P0645 Pemformatan Teks dan, jika diterima, di atas akan menjadi:
auto result = std::format("{}{}", name, age);
Penafian : Saya penulis perpustakaan {fmt}.
Boost::lexical_cast
,std::stringstream
,std::strstream
(yang sudah ditinggalkan), dansprintf
vssnprintf
.