Std :: string və int necə birləşmək olar?

Mən çox sadə olacağını düşünürdüm, amma bəzi çətinliklər yaradır. Əgər varsa

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

Tək bir simli "John21" almaq üçün onları necə birləşdirmək olar?

587
10 окт. Obediah Stane 10 oktyabr təyin etdi . 2008-10-10 18:05 '08 at 18:05 2008-10-10 18:05
@ 30 cavab

Əlifba sırası ilə:

 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 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 winstl::int_to_string() result = name + winstl::int_to_string(age); // 11. With Poco NumberFormatter result = name + Poco::NumberFormatter().format(age); 
  1. təhlükəsiz, lakin yavaş; Boost tələb edir (yalnız başlıq); ən / bütün platformalar
  2. təhlükəsiz, C ++ 11 tələb edir ( to_string () artıq #include <string> daxil edilir)
  3. təhlükəsiz və sürətli; tərtib edilməli olan FastFormat tələb edir; ən / bütün platformalar
  4. təhlükəsiz və sürətli; tərtib edilməli olan FastFormat tələb edir; ən / bütün platformalar
  5. təhlükəsiz və sürətli; {fmt} kütüphanesi tələb olunur; bu, yalnız başlıq rejimində tərtib edilə və ya istifadə edilə bilər; ən / bütün platformalar
  6. təhlükəsiz, yavaş və sözsüz; #include <sstream> (C ++ standartından)
  7. həssasdır (kifayət qədər böyük bir tampon təmin etməlisiniz), sürətli və dəqiqdir; itoa () qeyri-standart bir uzantıdır və bütün platformalar üçün təmin edilə bilməz.
  8. həssasdır (kifayət qədər böyük bir tampon təmin etməlisiniz), sürətli və dəqiqdir; bir şey tələb etmir (standart C ++); bütün platformalar
  9. kövrəkdir (kifayət qədər böyük bir tampon təmin etməlisiniz), bəlkə də ən sürətli çevrilmə , dəqiqlik; STLSoft (yalnız başlıq) tələb edir; ən / bütün platformalar
  10. Təhlükəsiz-iş (bir ifadədə birdən çox int_to_string () zəngini istifadə etməyin), tez; STLSoft (yalnız başlıq) tələb edir; Yalnız Windows
  11. təhlükəsiz, lakin yavaş; Poco C ++ tələb edir; ən / bütün platformalar
998
23 мая '09 в 0:16 2009-05-23 00:16 Cavab DannyT 23 May '09 'da 0:16' da verilmişdir 2009-05-23 00:16

C ++ 11-də std::to_string istifadə edə bilərsiniz, məsələn:

border=0
 auto result = name + std::to_string( age ); 
238
08 авг. Jeremy tərəfindən verilmiş cavab 08 avqust. 2012-08-08 11:17 '12 at 11:17 2012-08-08 11:17

Bir Boost varsa, boost::lexical_cast<std::string>(age) istifadə edərək, bir tamsayıya bir ədədi çevirə bilərsiniz.

Başqa bir üsul dize axınlarını istifadə etməkdir:

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

Üçüncü bir yanaşma C kitabxanasından sprintf və ya snprintf istifadə etmək sprintf .

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

Digər plakatlar itoa istifadə təklif. Bu standart bir xüsusiyyət deyil, belə ki, istifadə etdiyiniz təqdirdə kodunuz portativ olmayacaqdır. Bunu dəstəkləməyən kompüterlər var.

81
10 окт. Jay Conrodun 10 oktyabrda cavabı 2008-10-10 18:11 '08 at 18:11 2008-10-10 18:11
 std::ostringstream o; o << name << age; std::cout << o.str(); 
73
10 окт. 10 oktyabrda Ben Hoffstein tərəfindən verilmiş cavab 2008-10-10 18:09 '08 at 6:09 pm 2008-10-10 18:09
 #include <iostream> #include <string> #include <sstream> using namespace std; string itos(int i) // convert int to string { stringstream s; s << i; return s.str(); } 

Hüznlü olaraq http://www.research.att.com/~bs/bs_faq2.html dan oğurlandıq.

49
10 окт. Cavab verildi 10 oktyabr. 2008-10-10 18:09 '08 at 6:09 pm 2008-10-10 18:09

Bu ən asan yoludur:

 string s = name + std::to_string(age); 
27
22 дек. Cavab 22 dekabrda Kevin tərəfindən verilir. 2014-12-22 00:50 '14 'də 0:50 2014-12-22 00:50

Mənə ən asan cavab sprintf funksiyasından istifadə etməkdir:

 sprintf(outString,"%s%d",name,age); 
19
10 окт. cavab 101212121010 tərəfindən verilir . 2008-10-10 18:56 '08 at 18:56 2008-10-10 18:56

C ++ 11 varsa, std::to_string istifadə edə bilərsiniz.

Məsələn:

 std::string name = "John"; int age = 21; name += std::to_string(age); std::cout << name; 

Çıxış:

 John21 
18
28 мая '13 в 0:56 2013-05-28 00:56 Cavab verilir 0x499602D2 May 28, '13 'də 0:56 2013-05-28 00:56

Məni şərh etmək üçün kifayət qədər karma yox (redaktə etməyi nəzərdə tutmur), amma Jay postu (hazırda 27-də səs verən) bir səhv var. Bu kod:

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

Birləşdirilmiş simli və tamsayıdan ibarət olan bir simli yaratma göstərilən problemi həll etməyə kömək edirmi? Hesab edirəm ki, Jay bu kimi bir şey nəzərdə tutur:

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

Sonuncu xətt yalnız nəticə yazdırmaq üçün nəzərdə tutulmuşdur və son birləşdirilmiş simliə necə daxil olacağını göstərir.

15
16 окт. Cavab 16 oktyabr istirahət etməklə verilir . 2008-10-16 11:46 '08 saat 11:46 'da 2008-10-16 11:46
 #include <string> #include <sstream> using namespace std; string concatenate(std::string const name, int i) { stringstream s; s << name << i; return s.str(); } 
15
10 окт. Seb Qızın 10 oktyabrda verdiyi cavabı 2008-10-10 18:12 '08 at 18:12 'da 2008-10-10 18:12

Herb Sutter bu mövzuda yaxşı bir məqalə var: Manor Farm'ın Stringformaters . Boost::lexical_cast , std::stringstream Boost::lexical_cast , std::stringstream std::strstream (köhnəlmiş) və sprintf və s. snprintf .

12
10 окт. Fred Larson tərəfindən verilmiş cavab 10 oktyabr. 2008-10-10 19:54 '08 at 19:54 2008-10-10 19:54
 #include <sstream> template <class T> inline std::string to_string (const T t) { std::stringstream ss; ss << t; return ss.str(); } 

Sonra istifadə sizin kimi bir şey görünür.

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

Googled [və təsdiq: p]

11
10 окт. Cavab Zing- 10 oct verilir . 2008-10-10 22:53 '08 saat 22:53 'da 2008-10-10 22:53

Bir çıxış bildirişinin hər şeyi birləşdirmək üçün + istifadə etmək istəyirsinizsə, operator+ şablonunun bir versiyasını təmin edə bilərsiniz:

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

Sonra birləşmələrinizi sadə şəkildə yaza bilərsiniz:

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

Nəticə:

 the answer is 42 

Bu ən səmərəli yol deyildir, amma bir loop içərisində bir çox bitiş etmədiyiniz müddətcə ən səmərəli yola ehtiyacınız yoxdur.

7
03 нояб. Cavab uckelman tərəfindən verilir 03 Nov. 2011-11-03 16:26 '11 at 16:26 2011-11-03 16:26

MFC istifadə etsəniz, CString istifadə edə bilərsiniz

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

İdarə edilən C ++ da simli formata malikdir .

5
10 окт. Cavab bsruth 10 oktyabr verilir . 2008-10-10 20:13 '08 saat 20:13 'da 2008-10-10 20:13

Ümumi cavab: itoa ()

Bu pisdir. burada göstərildiyi kimi, itoa qeyri-standartdır.

4
10 окт. Cavab Tom Ritter Oct 10 2008-10-10 18:09 '08 at 6:09 pm 2008-10-10 18:09

Bir intu aşağıdakı sadə metoddan istifadə edərək simli birləşdirə bilər, ancaq tam bərabər bir ədəddən ibarət olduqda bu yalnız işlədiyini qeyd edin. Əks halda, bu xəttin rəqəmindən sonra bir tam ədədi əlavə edin.

 string name = "John"; int age = 5; char temp = 5 + '0'; name = name + temp; cout << name << endl; Output: John5 
4
28 сент. cavab 28 sentyabrda Sukhbir tərəfindən verilir . 2016-09-28 21:15 '16 saat 21:15 'də 2016-09-28 21:15

Std :: ostrinqstream yaxşı bir üsuldur, amma bəzən bu əlavə hiylə asanlıqla bir xətt üçün formatlaşdıra bilər:

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

İndi xətləri aşağıdakı kimi biçimlendirebilirsiniz:

 int main() { int i = 123; std::string message = MAKE_STRING("i = " << i); std::cout << message << std::endl; // prints: "i = 123" } 
4
11 окт. Cavab Pyry Jahkola 11 oktyabr tərəfindən verilir . 2008-10-11 01:08 '08 at 01:08 2008-10-11 01:08

Qt ilə əlaqədar sual bu xeyrinə bağlanıldığından, Qt-ı istifadə etməklə bunu necə etmək olar?

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

Dəyişən dəyişən indeksin sonunda% 1-ə və bəzilərinə bəzi dəyişikliklər yerinə müəyyən edilir.

4
10 авг. cavab verildi leinir 10 aug. 2011-08-10 16:29 '11 at 16:29 2011-08-10 16:29

Bu problem müxtəlif yollarla həll edilə bilər. Bunu iki şəkildə göstərəcəyəm:

  1. To_string (i) istifadə edərək, bir simvolu bir nöqtəyə çevirmək.

  2. String axınlarını istifadə edin.

    Kod:

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

// kömək etməyə ümid edirəm

3
29 июня '18 в 6:39 2018-06-29 06:39 Cavab lohith99 tərəfindən 29 iyun '18' də 6:39 2018-06-29 06:39 'də verilir

Parametri olaraq bir int alır və bir simli literal çevirir funksiyası yazdım. Bu funksiya bir simvolu simvolik ekvivalentinə çevirən başqa funksiyaya bağlıdır:

 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 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; } 
3
28 авг. Cavab Reda Lahdili tərəfindən verilir 28 avqust . 2013-08-28 16:23 '13 at 16:23 2013-08-28 16:23

Siz char * almaq və yuxarıda göstərilənlərə uyğun olaraq stringstream istifadə etmək istəyirsinizsə, aşağıdakı adımları edin:

 myFuncWhichTakesPtrToChar(ss.str().c_str()); 

Sətir str () vasitəsilə standart simli qaytararkən istədiyiniz cədvəlin növü üçün c_str () zəng edə bilərsiniz.

3
26 июля '11 в 22:45 2011-07-26 22:45 Cavab Mühəndis tərəfindən 26 iyul '11 'də saat 22:45' da 2011-07-26 22:45 'də verilir

Bir tamsayı (və ya digər ədədi obyektin) bir simli ilə birləşdirmək üçün daha çox variantlardan istifadə edə bilərsiniz. Bu 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); } 

və Karma'dan 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 tamsayıları çevirmək üçün ən sürətli seçimlərdən biri olmağı iddia edir.

3
04 окт. Cavab 04 oktyabr ayının mloskotu verilir . 2010-10-04 13:00 '10 saat 13:00 'da 2010-10-04 13:00

IOStreams aspektlərini təhlil və formatlaşdırma üsullarından istifadə edərək, bir daşıma int üçün necə əlavə olunacaq.

 #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 } 
2
25 нояб. Cavab verilir 0x499602D2 25 noyabr. 2013-11-25 16:57 '13 'da 16:57 2013-11-25 16:57
  • std :: ostrinqstream
 #include <sstream> std::ostringstream s; s << "John " << age; std::string query(s.str()); 
  • std :: to_string (C ++ 11)
 std::string query("John " + std::to_string(age)); 
  • təşviqi :: lexical_cast
 #include <boost/lexical_cast.hpp> std::string query("John " + boost::lexical_cast<std::string>(age)); 
2
03 авг. Cavab İsma Rekathakusuma 03 aug verilir. 2018-08-03 10:09 '18 at 10:09 2018-08-03 10:09

Bunu etmək üçün başqa bir asan yol:

 name.append(age+""); cout << name; 
1
25 нояб. Passant El.Agroudy tərəfindən verilmiş cavab 25 noyabr 2011-11-25 13:54 '11 at 13:54 2011-11-25 13:54

Daha ətraflı cavab aşağıdakılardan bəzilərini yeniləyərək digər cavablarda aşağıda verilir:

 #include <iostream> // cout #include <string> // string, to_string(some_number_here) using namespace std; int main() { // using constants cout << "John" + std::to_string(21) << endl; // output is: // John21 // using variables string name = "John"; int age = 21; cout << name + to_string(age) << endl; // output is: // John21 } 
1
11 февр. Cavab Manohar Reddy Poreddy tərəfindən verilir 11 fevral. 2018-02-11 07:11 '18 saat 07:11 'də 2018-02-11 07:11

{Fmt} kitabxanası ilə :

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

Kitabxananın bir alt kümesi standartlaşdırma üçün P0645 mətn formatı kimi təklif olunur və qəbul edildikdə yuxarıdakılar olacaq:

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

Disclaimer : Mən kitabxananın müəllifi {fmt}.

0
29 апр. cavab vitaut 29 Aprel verilir 2018-04-29 20:12 '18 saat 20:12 'də 2018-04-29 20:12

Kiçik bir sıra üçün C ++ 11 olmadan, mənə lazım olan bütün bunları tapdım:

Aşağıdakı variantları bir yerdə elan et / təmin et:

 const string intToString[10] = {"0","1","2","3","4","5","6","7","8","9"}; 

Sonra:

 string str = intToString[3] + " + " + intToString[4] + " = " + intToString[7]; //str equals "3 + 4 = 7" 

Həm də siyahıları ilə işləyir.

0
30 апр. Anton Kibalnikin aprelin 30-da verdiyi cavabı 2014-04-30 06:54 '14 at 6:54 2014-04-30 06:54

Mənim kimi insanlar üçün C ++ 11 və əlavə kitabxanalara və başlıqlara çıxma kimi imkanlara alternativ bir həll təklif edin. Sadə dönüşüm bu kimi işləyir:

3 ədəd ascii çevirmək üçün nümunə sayı 4, sadəcə kodu istifadə edə bilərsiniz:
a = '0' + 4 verin

Bu, dərhal 4 bir xarakter olaraq saxlayacaqdır.

Buradan sadəcə qalanın qalan hissəsi ilə birləşə bilərik.

-1
07 янв. cavab drewyu 07 jan verildi . 2017-01-07 19:30 '17 saat 7:30 'da 2017-01-07 19:30

Mən təcrübəsiz C ++ istifadəçisi oldum və bunu ən asan şəkildə tapdım:

 cout << name << age; 

İsmini və yaşını uğurla bağlayacaq, çıxış "John21" olacaq.

Ancaq heç kimin bunu söyləməsinin səbəbi olmalı; Hesab edirəm ki, bu mənfi cəhət ola bilər, baxmayaraq ki, bu qədər baş verməmişəm.

EDIT: Mən bunun mütləq düzgün cavab olmadığını başa düşdüm, amma C ++ yeni başlayanlar birləşən simləri necə çıxartmaq istəsə, burada saxlayacağam.

-5
17 сент. Cavab Əvəzedici seçicilər tərəfindən verilir . 2014-09-17 17:40 '14, 5:40 pm 2014-09-17 17:40