2009-06-03 14 views

Odpowiedz

49

Można użyć stringstream.

#include <sstream> 

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

Zwykle w bibliotece standardowej kompilatora znajduje się kilka zastrzeżonych funkcji języka C, które również to robią. Wolę jednak bardziej "przenośne" warianty.

Sposób C to zrobić z sprintf, ale to nie jest bardzo bezpieczne. W niektórych bibliotekach są nowe wersje, takie jak sprintf_s, które chroni przed przepełnieniami bufora.

1

Sprawdź 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

To std :: string, a nie std :: String. – avakar

+0

Dziękuję - problemy z palcem. –

-1

Sposób, w jaki zwykle to robię jest z sprintf. Tak więc przez długi można wykonać następujące czynności zakładając, że jesteś na architekturze 32 bitowej:

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

-1. Podczas gdy kompilator C++ skompiluje twój kod, nie powinien nazywać się C++. Dodatkowo wątpię, aby wystarczyło 5 znaków. – avakar

+1

Prosimy nie zalecać sprintf w tym dniu i wieku. Czy nie mamy wystarczająco dużo exploitów przepełnienia bufora? Nie znaczy to, że ten kod wydaje się mieć jak napisano - ale nigdy nie wiesz, jak się zmienia. – philsquared

+1

Phil, bufor przepełni się dla dowolnej liczby powyżej 10000. – avakar

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

Dobrze, jeśli jesteś fanem kopiowania i wklejania, to jest tutaj:

#include <sstream> 

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

Tęskniłeś za 'szablonem '. – avakar

+0

Dzięki, mam aktualizację odpowiedzi. –

+0

'inline' jest teraz zbędny. – avakar

7

Nie wiem, jakiego rodzaju jest to praca domowa, ale najprawdopodobniej nauczyciel nie chce odpowiedzieć, gdzie po prostu zadzwoń do "magicznej" istniejącej funkcji (mimo że jest to zalecany sposób), ale on chce sprawdzić, czy możesz to zaimplementować samodzielnie.

Dawno temu, mój nauczyciel zwykł mówić coś w stylu "Chcę sprawdzić, czy możesz samemu zaprogramować program, a nie, czy możesz go znaleźć w systemie". Cóż, jak się mylił;) ..

W każdym razie, jeśli nauczyciel jest taki sam, tutaj jest trudna droga to zrobić ..

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

Można argumentować, że nie jest za pomocą std::string "na własnej skórze", ale myślę, że to, co się liczy w rzeczywistym agorycie.

+0

Tym razem dobrze jest korzystać z gotowych funkcji. Ale dzięki za ten pomysł. –

+0

Naprawdę? Po prostu sprawdza, czy możesz gdzieś znaleźć funkcję? Tak, czasy się zmieniły;) .. – beef2k

+0

@ beef2k Jeszcze lepiej - zauważa, że ​​znam OOP, czuje się pod wrażeniem i nie sprawdza niczego innego. :) –

1

Jedną z rzeczy, które nie są objęte ktokolwiek do tej pory, aby pomóc Ci myśleć o problem dalej, to w jakim formacie powinny długa odbioru, gdy jest rzutowane na sznurku.

Wystarczy spojrzeć na program arkusza kalkulacyjnego (np. Calc/Excel). Czy chcesz go zaokrąglić do najbliższego miliona, z nawiasami, jeśli jest ujemny, zawsze, aby pokazać znak ... Czy numer jest rzeczywiście reprezentacją czegoś innego, czy zamiast tego należy go pokazać w Oractal lub Hex?

Dotychczasowe odpowiedzi dały pewne domyślne wyniki, ale być może nie są prawidłowe.

+0

Gdybym tego potrzebował, edytowałbym moje pytanie. :) –

+0

Uwielbiam, podaję rozważną odpowiedź na to pytanie, aby pomóc w myśleniu o odrabianiu zadań domowych, zamiast udzielać odpowiedzi, która już tam była, a ja dostaję awans, w międzyczasie "std :: stringstream" ma upvote ... –

41

W C++ 11, istnieją funkcje std :: to_string i std :: to_wstring w <string>.

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

Można użyć std::to_string w C++ 11

long val = 12345; 
std::string my_val = std::to_string(val); 
Powiązane problemy