2009-06-03 16 views

risposta

49

È possibile utilizzare stringstream.

#include <sstream> 

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

Di solito ci sono alcune funzioni C proprietarie nella libreria standard per il compilatore che lo fa anche. Preferisco le varianti più "portatili" però.

Il modo C di farlo sarebbe con sprintf, ma non è molto sicuro. In alcune librerie ci sono nuove versioni come sprintf_s che protegge dai sovraccarichi del buffer.

1

Check out std::stringstream.

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, non std :: String. – avakar

+0

Grazie - problemi con le dita. –

-1

Il modo in cui lo faccio in genere è con sprintf. Così per molto che si possa fare quanto segue partendo dal presupposto che siete su un'architettura a 32 bit:

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

-1. Mentre un compilatore C++ compilerà il tuo codice, non dovrebbe certamente essere chiamato C++. Inoltre, dubito che 5 caratteri siano sufficienti. – avakar

+1

Per favore non difendere sprintf in questo giorno ed età. Non abbiamo abbastanza exploit di sovraccarico del buffer? Non che questo codice sembri averlo come scritto - ma non sai mai come cambiano le cose. – philsquared

+1

Phil, il buffer traboccherà per qualsiasi numero superiore a 10000. – avakar

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

Beh, se siete fan di copia-incolla, eccola:

#include <sstream> 

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

Hai perso 'modello '. – avakar

+0

Grazie, ho aggiornato la risposta. –

+0

'inline' è ora ridondante. – avakar

7

Non so che tipo di compiti a casa questo è, ma molto probabilmente l'insegnante non voglio una risposta in cui si basta chiamare una funzione "magica" esistente (anche se questo è il modo consigliato di farlo), ma vuole vedere se è possibile implementarlo da solo.

In passato, il mio insegnante diceva qualcosa del tipo "Voglio vedere se riesci a programmare da solo, non se lo trovi nel sistema." Ebbene, come si sbagliava;) ..

In ogni caso, se il tuo insegnante è lo stesso, qui è nel modo più duro per farlo ..

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

Si potrebbe sostenere che l'utilizzo non è std::string "nel modo più duro", ma immagino quello che conta nell'attuale agorithm.

+0

Questa volta va bene usare le funzioni pronte. Ma grazie per questa bella idea. –

+0

Davvero? Sta solo controllando se riesci a trovare una funzione da qualche parte? Sì, i tempi sono cambiati;) .. – beef2k

+0

@ beef2k Ancora meglio - si accorge che conosco OOP, si sente colpito e non controlla nient'altro. :) –

1

Una delle cose non coperti da nessuno fino ad ora, per aiutarvi a pensare al problema ulteriormente, è quello formato deve prendere una lunga quando si è gettato in una stringa.

Basta dare un'occhiata a un programma spreedsheet (come Calc/Excel). Lo vuoi arrotondato al milione più vicino, con parentesi se è negativo, sempre per mostrare il segno .... Il numero è davvero una rappresentazione di qualcos'altro, dovresti invece mostrarlo in Oractal o Hex?

Le risposte finora hanno fornito un output predefinito, ma forse non quello giusto.

+0

Se ne avessi avuto bisogno, avrei modificato la mia domanda. :) –

+0

Mi piace, do una risposta ponderata alla domanda per aiutare a pensare ai compiti piuttosto che dare la risposta che era già lì e ottengo un downvote, nel frattempo "std :: stringstream" ha un upvote ... –

41

In C++ 11, esistono in realtà le funzioni std :: to_string e std :: to_wstring nella stringa < >.

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

È possibile utilizzare std::to_string in C++ 11

long val = 12345; 
std::string my_val = std::to_string(val); 
Problemi correlati