C ++ dırnağında int bir dize çevirmək üçün en asan yol

int C ++-ə bərabər string çevirmək üçün ən asan yol. Mən iki üsul bilirəm. Daha asan bir yol varmı?

(1)

 int a = 10; char *intStr = itoa(a); string str = string(intStr); 

(2)

 int a = 10; stringstream ss; ss << a; string str = ss.str(); 
1285
08 апр. Nemo 08 Mart tarixində təyin olundu 2011-04-08 07:19 '11 at 7:19 2011-04-08 07:19
@ 25 cavab

C ++ 11 std::stoi (və hər ədədi tip üçün variantlar) və std::to_string , C atoiitoa analoqlarını təqdim edir, lakin std::to_string std::string ifadə edilir.

 #include <string> std::string s = std::to_string(42); 

buna görə düşünə biləcəyim ən qısa yol. auto açar sözünü istifadə edərək belə adını ata bilərsiniz:

 auto s = std::to_string(42); 

Qeyd: [String.conversions] ( n3242-də 21.5 )

1700
08 апр. Cavab Matthieu M. 08 apr. 2011-04-08 09:13 '11 at 9:13 2011-04-08 09:13

Bir neçə il sonra @ v.oddou köməyi ilə müzakirəni yekunlaşdıraraq, C ++ 17 nəhayət macro-karbondan keçmədən başlanğıcda makro əsaslı tip-agnostik həllini (aşağıda saxlanılan) etmək üçün bir yol təqdim etdi.

 // variadic template template < typename... Args > std::string sstr( Args  args ) { std::ostringstream sstr; // fold expression ( sstr << std::dec << ... << args ); return sstr.str(); } 

İstifadə edin:

 int i = 42; std::string s = sstr( "i is: ", i ); puts( sstr( i ).c_str() ); Foo x( 42 ); throw std::runtime_error( sstr( "Foo is '", x, "', i is ", i ) ); 

Orijinal cavab:

border=0

"Converting ... to string" təkrarlanan bir problemdir, çünki mən həmişə C ++ mənbələrinin mərkəzi başlığında SSTR () makrosunu müəyyənləşdirirəm:

 #include <sstream> #define SSTR( x ) static_cast< std::ostringstream  >( \ ( std::ostringstream() << std::dec << x ) ).str() 

İstifadə mümkün qədər sadədir:

 int i = 42; std::string s = SSTR( "i is: " << i ); puts( SSTR( i ).c_str() ); Foo x( 42 ); throw std::runtime_error( SSTR( "Foo is '" << x << "', i is " << i ) ); 

Yuxarıda göstərilən C ++ 98 (C ++ 11 std::to_string istifadə edə std::to_string ) və hər hansı bir üçüncü tərəf lexical_cast<> (Boost lexical_cast<> istifadə edə bilməzsinizsə); Ancaq bu həllərin hər ikisi daha yaxşı bir performansa sahibdirlər.

171
08 апр. Cavab verildi DevSolar 08 Apr. 2011-04-08 07:23 '11 at 7:23 am 2011-04-08 07:23

Mən adətən aşağıdakı metoddan istifadə edirəm:

 #include <sstream> template <typename T> std::string NumberToString ( T Number ) { std::ostringstream ss; ss << Number; return ss.str(); } 

burada ətraflı təsvir edilmişdir.

100
30 нояб. cavab 30 fevralda Rasoul'a verilir . 2012-11-30 01:46 '12 at 1:46 2012-11-30 01:46

Yəqin ki, ən geniş yayılmış sadə yol, əslində, lexical_cast adlı bir şablonda, məsələn, Boost-da ikinci seçiminizi ehtiva edir, buna görə lexical_cast belə görünür:

 int a = 10; string s = lexical_cast<string>(a); 

Onlardan biri digər dökümləri dəstəkləyir (məsələn, əks istiqamətdə də işləyir).

Həmçinin qeyd edək ki, Boost lexical_cast yalnız dəmir yolu axınına yazılıb və onu geri götürərək başladı, lakin indi bir neçə əlavə var. Hər şeydən əvvəl, ixtisaslar bir neçə növ üçün əlavə olunmuşdur, buna görə də bir çox ümumi növlər üçün simli akışdan daha xeyli sürətlidır. İkincisi, artıq nəticəni yoxlayır, beləliklə (misal üçün) bir 123abc int 123abc , string bir int (məsələn, 1234 müvəffəq olacaq, lakin 123abc atacaq ).

C ++ 11-də olduğu kimi, tam ədədlər üçün çox yüklənmiş std::to_string var, belə ki, kodu istifadə edə bilərsiniz, məsələn:

 int a = 20; std::string s = to_string(a); 

Standart onları sprintf (göstərilən obyekt növünə uyğun olan bir dönüşüm spesifikatorunu, məsələn, int üçün %d ) istifadə edərək, kifayət qədər ölçülü bir tampona çevirməklə, sonra bu tamponun məzmunu std::string yaratmaq üçün bərabər yerinə yetirir.

84
08 апр. Cavab Jerry Coffin tərəfindən verilir Apr 08 2011-04-08 07:23 '11 at 7:23 am 2011-04-08 07:23

Boost yüklənmişdirsə (lazım nədir):

 #include <boost/lexical_cast.hpp> int num = 4; std::string str = boost::lexical_cast<std::string>(num); 
41
08 апр. Apr 08-də Kevin tərəfindən cavablandı 2011-04-08 07:26 '11 saat 07:26 'da 2011-04-08 07:26

String axınlarını istifadə etmək daha asan olmazmı?

 #include <sstream> int x=42; //The integer string str; //The string ostringstream temp; //temp as in temporary temp<<x; str=temp.str(); //str is temp as string 

Və ya funksiyanı yerinə yetirin:

 #include <sstream> string IntToString (int a) { ostringstream temp; temp<<a; return temp.str(); } 
29
16 апр. 16 aprel tarixində user2287915 tərəfindən verilmiş cavab 2013-04-16 22:37 '13 saat 10:37 'da 2013-04-16 22:37

Mən təmiz C ++-da bildiyim deyil. Ancaq qeyd etdiyiniz şeyin bir az dəyişməsi.

 string s = string(itoa(a)); 

işləməlidir və olduqca qısa.

19
08 апр. Cavab Mehrdad 08 apr tərəfindən verilir . 2011-04-08 07:22 '11 at 07:22 2011-04-08 07:22

sprintf() format dönüşüm üçün olduqca yaxşıdır. Sonra 1-də etdiyiniz kimi, C string + C ++ simvoluna təyin edə bilərsiniz.

16
08 апр. Cavab verilir Throwback1986 08 apr. 2011-04-08 07:23 '11 at 7:23 am 2011-04-08 07:23

İlk növbədə:

 #include <string> #include <sstream> 

İkinci üsulu əlavə edin:

 template <typename T> string NumberToString(T pNumber) { ostringstream oOStrStream; oOStrStream << pNumber; return oOStrStream.str(); } 

Metodu aşağıdakı kimi istifadə edin:

 NumberToString(69); 

və ya

 int x = 69; string vStr = NumberToString(x) + " Hello word!." 
12
01 июня '13 в 0:32 2013-06-01 00:32 cavab 01 iyun 2013-cü il tarixində 0:32 2013-cü il saat 00.00-da verilir

Matthieu M tərəfindən təklif edilən C ++ 11-də std::to_string istifadə edə bilərsiniz:

 std::to_string(42); 

Və ya performans fmt::FormatInt (məsələn, bir çox dönüşüm fmt::FormatInt ), tam sayı std::string dönüştürmek üçün C ++ format kitaplığından fmt::FormatInt istifadə edə bilərsiniz:

 fmt::FormatInt(42).str(); 

Və ya C satırı:

 fmt::FormatInt f(42); f.c_str(); 

Sonuncu dinamik yaddaş ayırmalarını yerinə yetirmir və Boost Karma testlərində std::to_string -dən 10 qat daha sürətli olur. Daha ətraflı məlumat üçün strinqləri C ++-ə çevirmək üçün Tez Integer bölməsinə baxın.

std::to_string dan fərqli olaraq, fmt::FormatInt C ++ 11 tələb etmir və hər hansı bir C ++ kompilyatoru ilə işləyir.

Disclaimer: Mən C ++ format kitabxanasının müəllifiyim.

9
25 мая '14 в 16:42 2014-05-25 16:42 Cavab verilsə vitaut May 25, '14 də 16:42 2014-05-25 16:42

Nömrələri çevirmək üçün stringstream istifadə təhlükəlidir!

operator<< formatlaşdırılmış çıxışlar üçün http://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/ səhifəsinə baxın.

Mövcud locale bağlı olaraq, 3 rəqəmdən daha böyük bir tamsayı, əlavə minlərlə ayırıcı əlavə edərək 4 haneli bir dize çevrilə bilər.

Məsələn, int = 1000 1.001 simvoluna çevrilə bilər. Bu, müqayisə əməliyyatları heç də işləməyəcəkdir.

Buna görə std::to_string istifadə etməyi məsləhət std::to_string . Bu asan və gözlədiyiniz şeyi edir.

8
18 авг. Cavab verilmişdir Bəli . 2017-08-18 15:47 '17 saat 15:47 'də 2017-08-18 15:47

C ++ 98 üçün bir neçə variant var:

boost/lexical_cast

Boost C ++ kitabxanasının bir hissəsidir, lakin bir çox faydalı kitabxana uzantıları ehtiva edir.

lexical_cast funksiyası lexical_cast , mətn kimi təqdim edildikdə ümumi dəyişiklikləri və özbaşına aid növlərdən istifadə etmək üçün rahat və ardıcıl bir forma təklif edir.
- Əlavə sənədlər

 #include "boost/lexical_cast.hpp" #include <string> int main() { int x = 5; std::string x_str = boost::lexical_cast<std::string>(x); return 0; } 

İcra vaxtına gəldikdə, lexical_cast əməliyyatı ilk dönüşümdə təxminən 80 mikrosaniyadır (sonra mənim lexical_cast ) və daha sonra yerinə yetirildikdə əhəmiyyətli ölçüdə sürətlənir.


itoa

Bu funksiya ANSI-C-də müəyyənləşdirilməyib və C ++-nin bir hissəsidir, lakin bəzi kompilyatorlar tərəfindən dəstəklənir.
- cplusplus.com

Bu, gcc / g++ kodunu istifadə edərək kodu tərtib edə bilməz.

 #include <stdlib.h> int main() { int x = 5; char * x_str = new char[2]; x_str = itoa(x, x_str, 10); // base 10 return 0; } 

Hesabat üçün heç bir iş müddəti yoxdur. Visual Studio yüklü deyil, bu kompilyasiya etmək itoa .


sprintf

sprintf , C strings üzərində işləyən standart bir C kitabxana funksiyasıdır və mükəmməl bir alternativdir.

Biçim printf formatında istifadə edildikdə çap olunacaq eyni mətn ilə simli tərtib edir, lakin yazdırma əvəzinə məzmun Ctrl ilə göstərilən tamponda C siması kimi saxlanır.
- cplusplus.com

 #include <stdio.h> int main() { int x = 5; char * x_str = new char[2]; int chars_written = sprintf(x_str, "%d", x); return 0; } 

stdio.h başlığı lazım ola bilər. İcra vaxtına gəldikdə, sprintf əməliyyatı ilk dönüşümdə təxminən 40 mikrosaniyadır (sonra mənim sprintf ) və daha sonra yerinə yetirildiyi təqdirdə əhəmiyyətli ölçüdə sürətlənir.


stringstream

Bu C ++ kitabxanası, tamsayıları dizgələrə və əksinə çevirmək üçün əsas üsuldur. ostringstream axın üçün nəzərdə tutulan istifadəni daha da məhdudlaşdıran ostringstream üçün bənzər qardaş funksiyaları var. ostringstream istifadə xüsusilə kodu oxucu demək yalnız << operator, əsasən istifadə etmək niyyətindədir ki, deyir. Bu funksiya bir tamsayı bir simliya çevirmək üçün xüsusilə lazım olan hər şeydir. Daha çox müzakirə üçün bu suala baxın.

 #include <sstream> #include <string> int main() { int x = 5; std::ostringstream stream; stream << x; std::string x_str = stream.str(); return 0; } 

İcra vaxtına gəldikdə, ostringstream hərəkəti təxminən 71 mikrosaniyedir ( ostringstream ) və bundan sonra daha çox yerinə yetirildikdən sonra əvvəlki funksiyalardan daha çox sürətlənir.


Əlbəttə ki, digər variantlar var və hətta onların birindən öz funksiyasına köçürə bilərsiniz, amma bu, bəzi populyar olanlara analitik baxır.

7
20 июня '17 в 17:48 2017-06-20 17:48 Cavab Yos Detwiler tərəfindən 20 İyun '17' də 17:48 2017-06-20 17:48 'də verilir

Sxematik şəkər əlavə etmək olduqca asandır, bu da birbaşa axın yolunda sətirlər yaratmağa imkan verir.

 #include <string> #include <sstream> struct strmake { std::stringstream s; template <typename T> strmake operator << (const T x) { s << x; return *this; } operator std::string() {return s.str();} }; 

İndi istənilən şeyi əlavə edə bilərsiniz (operator üçün << (std::ostream> bunun üçün müəyyən edilir) strmake()std::string yerinə istifadə edin.

Məsələn:

 #include <iostream> int main() { std::string x = strmake() << "Current time is " << 5+5 << ":" << 5*5 << " GST"; std::cout << x << std::endl; } 
3
03 февр. Cavab AndreyS Şerbakov tərəfindən verilib 03 fevral. 2018-02-03 12:17 '18 at 12:17 pm 2018-02-03 12:17

İstifadə edin:

 #define convertToString(x) #x int main() { convertToString(42); // Returns const char* equivalent of 42 } 
3
14 апр. Cavab verilir maverick9888 14 apr. 2016-04-14 12:10 '16 at 12:10 2016-04-14 12:10

Mən istifadə edirəm:

 int myint = 0; long double myLD = 0.0; string myint_str = static_cast<ostringstream*>(  << myint) )->str(); string myLD_str = static_cast<ostringstream*>(  << myLD) )->str(); 

Windows və linux g ++ tərtibçiləri üzərində işləyir.

1
18 янв. Cavab J_C 18 jan verilir . 2014-01-18 22:59 '14 saat 10:59 'da 2014-01-18 22:59
 string number_to_string(int x){ if(!x) return "0"; string s,s2; while(x){ s.push_back(x%10 + '0'); x/=10; } reverse(s.begin(),s.end()); return s; } 
1
17 дек. Cavab Abdullah Abdelmonem 17 dekabrda verilir. 2015-12-17 00:10 '15 at 0:10 'da 2015-12-17 00:10
 namespace std { inline string to_string(int _Val) { // convert long long to string char _Buf[2 * _MAX_INT_DIG]; snprintf(_Buf, "%d", _Val); return (string(_Buf)); } } 

indi to_string(5) istifadə edə bilərsiniz to_string(5)

1
21 февр. Cavab 21 fevralda user1363411 tərəfindən verilir. 2013-02-21 13:18 '13 'da 13:18' də 2013-02-21 13:18
 #include "stdafx.h" #include<iostream> #include<string> #include<string.h> std::string intToString(int num); int main() { int integer = 4782151; std::string integerAsStr = intToString(integer); std::cout << "integer = " << integer << std::endl; std::cout << "integerAsStr = " << integerAsStr << std::endl; return 0; } std::string intToString(int num) { std::string numAsStr; while (num) { char toInsert = (num % 10) + 48; numAsStr.insert(0, 1, toInsert); num /= 10; } return numAsStr; } 
1
05 июня '18 в 11:02 2018-06-05 11:02 Cavab Tayyab Mazhar tərəfindən 05 iyun '18' də saat 11:02 2018-06-05 11:02 tarixində verilir

CString istifadə:

 int a = 10; CString strA; strA.Format("%d", a); 
1
05 февр. cavab 05 fevral 2013 tarixinə verilir. 2014-02-05 19:25 '14 da 19:25 2014-02-05 19:25

Bir tam sayının sabit sayıya bərabər olması lazımdırsa, "0" -ın sola * sol tərəfinə, bu rahat bir nümunədir:

 int n = 27; char s[8]; 

İki haneli bir ədədi çevirirsən:

 *(int32_t*)s = 0x3030 | (n/10) | (n%10) << 8; 

Üç haneli bir sayını çeviriyorsanız:

 *(int32_t*)s = 0x303030 | (n/100) | (n/10%10) << 8 | (n%10) << 16; 

Dörd rəqəmli rəqəmi çevirirsinizsə:

 *(int64_t*)s = 0x30303030 | (n/1000) | (n/100%10)<<8 | (n/10%10)<<16 | (n%10)<<24; 

Və yeddi rəqəmli nömrələrə görə :)

0
25 нояб. 25 noyabr tarixində Alek tərəfindən verilmiş cavab. 2016-11-25 10:36 '16 saat 10:36 'da 2016-11-25 10:36

Burada başqa bir asan yol

 char str[100] ; sprintf(str , "%d" , 101 ) ; string s = str; 

sprintf hər hansı bir məlumatı lazımi formatın bir simvoluna yerləşdirmək üçün yaxşı bilinir.

Üçüncü xəttdə göstərildiyi kimi, char * arrayini simliya çevirə bilərsiniz.

0
07 февр. Cavab Natesh bhat 07 fevral. 2018-02-07 19:10 '18 saat 07:10 'da 2018-02-07 19:10

Mən stringstream istifadə olduqca sadədir düşünürəm.

  string toString(int n) { stringstream ss(n); ss << n; return ss.str(); } int main() { int n; cin>>n; cout<<toString(n)<<endl; return 0; } 
0
17 сент. Cavab rashedcs verilir 17 sep . 2018-09-17 16:37 '18 saat 16:37 'da 2018-09-17 16:37
 int n = 123; std::string str = std::to_string(n); 
0
26 июля '18 в 16:46 2018-07-26 16:46 cavab 26 iyul 18:18 saat 16:46 2018-07-26 16:46 ilə Kamrujjaman Joy tərəfindən verilir
 char * bufSecs = new char[32]; char * bufMs = new char[32]; sprintf(bufSecs,"%d",timeStart.elapsed()/1000); sprintf(bufMs,"%d",timeStart.elapsed()%1000); 
0
06 февр. Cavab verilir user2047065 06 fevral. 2013-02-06 16:40 '13 saat 16:40 'da 2013-02-06 16:40

Bir simli çevirmək üçün counter alqoritmindən istifadə edirsiniz. Commodore 64- nin proqramlaşdırılmasından bu texnikanı aldım. Oyun proqramlaşdırma üçün də faydalıdır.

  • Bir tamsayı alır və hər bir dərəcə dərəcə ilə 10 dərəcə çəkirsiniz. Tam ədəd 950 olduğunu varsayalım.

    • Tam ədəd 100.000-ə bərabərdirsə və ya 10000-dən çox olarsa, 100.000-dən azaldın və hər bir satırı ["000000"] artırın;
      100 000 nöqtəsində daha çox ədəd olmadığı qədər bunu etməyə davam edin. Ondan bir daha gücünü buraxın

    • Tam ədəd 10,000-ə bərabərdirsə və ya 10,000-dən yuxarı çıxarsa, sayını ["000000"] + 1-də ardıcıl olaraq artıracaq;
      10,000-ə qədər mövqedən daha çox nömrələr olmadığı qədər bunu etməyə davam edirik.

  • Ondan bir gücünü buraxın

  • Repeat nümunəsi

Mən bilirəm ki, 950 nümunəsi kimi istifadə etmək çox azdır, amma ümid edirəm ki, bu fikri başa düşürsünüz.

-3
09 окт. Cavab 09 iyul Admiral Smithə verilir . 2016-10-09 22:18 '16 saat 10:18 'da 2016-10-09 22:18

Etiketler ilə bağlı digər suallar və ya bir sual