2009-06-03 25 views

cevap

49

Dize akışını kullanabilirsiniz.

#include <sstream> 

// ... 
std::string number; 
std::stringstream strstream; 
strstream << 1L; 
strstream >> number; 

Genellikle derleyici için standart kitaplıktaki bazı özel C işlevleri de vardır. Yine de daha "taşınabilir" varyantları tercih ederim.

Bunu yapmanın C yolu sprintf ile olurdu, ancak bu çok güvenli değil. Bazı kütüphanelerde, sprintf_s gibi arabellek taşmasına karşı koruma sağlayan yeni sürümler vardır.

1

std::stringstream'a bakın.

3
#include <sstream> 


    .... 

    std::stringstream ss; 
    ss << a_long_int; // or any other type 
    std::string result=ss.str(); // use .str() to get a string back 
+1

Std :: string, std :: String değil. – avakar

+0

Teşekkür ederim - parmak sıkıntısı. –

-1

Genelde yaptığım yöntem sprintf ile. Uzun yapabileceğin bir Yani şu bir 32 bit mimarisine olduklarını varsayarak:

char buf[5] = {0}; // one extra byte for null  
sprintf(buf, "%l", var_for_long); 
+1

-1. Bir C++ derleyicisi kodunuzu derlerken, kesinlikle C++ olarak adlandırılmamalıdır. Ayrıca, 5 karakter yeterli olduğundan şüphe ediyorum. – avakar

+1

Lütfen bu gün ve yaşlarda sprintf'i savunmayın. Yeterince tampon taşması istismarımız yok mu? Bu kodun yazılı olduğu gibi görünmüyor - ama hiçbir şeyin nasıl değiştiğini asla bilemezsiniz. – philsquared

+1

Phil, arabellek 10000 üzerinde herhangi bir sayı için taşacak. – avakar

8
int main() 
{ 
    long mylong = 123456789; 
    string mystring; 
    stringstream mystream; 
    mystream << mylong; 
    mystring = mystream.str(); 
    cout << mystring << "\n"; 
    return 0; 
} 
4

çeşitli yolları vardır. Ayrıntılı bir karşılaştırma için The String Formatters of Manor Farm'u okuyun. işte burada sen, kopyala-yapıştır hayranı Eh eğer

+0

Bu iyi bir yazı. – Skurmedel

+1

Evet. Bu en azından üçüncü kez bunu SO üzerinde bağladım. 8v) –

22

:

#include <sstream> 

template <class T> 
inline std::string to_string (const T& t) 
{ 
    std::stringstream ss; 
    ss << t; 
    return ss.str(); 
} 
+0

"Şablon " adlı videoyu kaçırdınız. – avakar

+0

Teşekkürler, cevabı güncelliyorum. –

+0

'Satır içi 'artık yedekli. – avakar

7

bunun ne ödev ne tür bilmiyorum ama büyük olasılıkla öğretmen bir cevap istemiyor nerede sadece "büyülü" bir varolan işlevi çağırın (bunu yapmak için önerilen yol olsa da), ancak bunu kendi başınıza uygulayıp uygulayamayacağınızı görmek ister.

Geçmişte, öğretmenim "Sistemde bulabiliyor olsanız bile, kendi başınıza programlayıp programlayamayacağınızı görmek istiyorum" gibi bir şey söylerdi. Eh, ne kadar yanlış olduğunu;) ..

Neyse, öğretmen burada aynıdır bunu yapmak zor yoluise ..

std::string LongToString(long value) { std::string output; std::string sign; if(value < 0) { sign + "-"; value = -value; } while(output.empty() || (value > 0)) { output.push_front(value % 10 + '0') value /= 10; } return sign + output; } 

Sen std::string kullanarak olmadığını iddia olabilir "zor yol", ama asıl agorithmde neyin geçerli olduğunu tahmin ediyorum. Burada

+0

Bu sefer hazır işlevleri kullanmak güzel. Ama bu düzgün fikir için teşekkürler. –

+0

Gerçekten mi? Sadece bir yerde bir işlev bulabilir misin diye kontrol ediyor mu? Evet, zaman değişti;) .. – beef2k

+0

@ beef2k Daha da iyisi - OOP'u bildiğimi fark eder, etkilendiğini hisseder ve başka hiçbir şey kontrol etmez. :) –

1

Bir, sorun daha da düşünmenize yardımcı olmak için, bir dizeye uzun almak döküm gerekirken Ne biçimidir.

Spreedsheet programına bir göz atın (Calc/Excel gibi). En yakın milyona yuvarlanır mı, eğer negatifse, her zaman işareti göstermek için köşeli parantezler… Sayının başka bir şeyin temsili olduğunu mu, yoksa Oractal veya Hex'te mi göstermelisiniz?

Şimdiye kadar verilen yanıtlar size bazı varsayılan çıktılar verdi, ancak belki de doğru olanları vermedi.

+0

Buna ihtiyacım olursa, sorumu düzenlerdim. :) –

+0

Sevgi, ben zaten orada olan cevap vermek yerine ödev hakkında düşünme yardımcı olmak için soruya verilen bir cevap vermek ve bir downvote aldım, bu arada 'std :: stringstream' bir ... –

41

C++ 11'de, <dize> dizgisinde std :: to_string ve std :: to_wstring işlevleri vardır.

string to_string(int val); 
string to_string(long val); 
string to_string(long long val); 
string to_string(unsigned val); 
string to_string(unsigned long val); 
string to_string(unsigned long long val); 
string to_string(float val); 
string to_string(double val); 
string to_string (long double val); 
1

Sen nitpicking ait C++ 11

long val = 12345; 
std::string my_val = std::to_string(val); 
İlgili konular