Ponieważ to pytanie jest zadawane co tydzień, to FAQ może pomóc wielu użytkownikom.
Jak przekonwertować liczbę całkowitą na ciąg w C ++
jak przekonwertować ciąg znaków na liczbę całkowitą w C ++
jak przekonwertować liczbę zmiennoprzecinkową na ciąg w C ++
jak przekonwertować ciąg na liczbę zmiennoprzecinkową w C ++
Odpowiedzi:
Aktualizacja dla C ++ 11
Począwszy od
C++11
standardowego, konwersji i string-to-liczby odwrotnie są wbudowane w bibliotece standardowej. Wszystkie poniższe funkcje są dostępne w<string>
(zgodnie z paragrafem 21.5).ciąg na numeryczny
Każdy z nich przyjmuje ciąg znaków jako dane wejściowe i próbuje przekształcić go w liczbę. Jeśli nie można skonstruować prawidłowej liczby, na przykład ponieważ nie ma danych liczbowych lub liczba jest poza zakresem dla typu, zgłaszany jest wyjątek (
std::invalid_argument
lubstd::out_of_range
).Jeśli konwersja zakończyła się powodzeniem i
idx
nie0
,idx
będzie zawierać indeks pierwszego znaku, który nie został użyty do dekodowania. Może to być indeks znajdujący się za ostatnim znakiem.Wreszcie typy całkowite pozwalają określić podstawę, dla cyfr większych niż 9 zakłada się alfabet (
a=10
doz=35
). Więcej informacji na temat dokładnego formatowania, które można przeanalizować tutaj dla liczb zmiennoprzecinkowych , liczb całkowitych ze znakiem i liczb całkowitych bez znaku .Wreszcie, dla każdej funkcji istnieje również przeciążenie, które akceptuje
std::wstring
jako pierwszy parametr.numeryczne na ciąg
Są prostsze, przekazujesz odpowiedni typ liczbowy i otrzymujesz ciąg znaków z powrotem. W przypadku opcji formatowania należy wrócić do opcji stringsream C ++ 03 i użyć manipulatorów strumienia, jak wyjaśniono w innej odpowiedzi tutaj.
Jak zauważono w komentarzach, funkcje te powracają do domyślnej precyzji mantysy, która prawdopodobnie nie jest maksymalną dokładnością. Jeśli aplikacja wymaga większej precyzji, najlepiej wrócić do innych procedur formatowania ciągów.
Istnieją również zdefiniowane podobne funkcje o nazwach
to_wstring
, które zwrócą plikstd::wstring
.źródło
std::to_string
traci dużo precyzji dla typów zmiennoprzecinkowych. Na przykładdouble f = 23.4323897462387526; std::string f_str = std::to_string(f);
zwraca ciąg 23,432390. Uniemożliwia to zaokrąglanie wartości zmiennoprzecinkowych za pomocą tych funkcji.sprintf(buf, fmt, val)
ze specyfikatorem formatu „% d ” , „% u ” , „% ld ” , „ % lu " , "% lld " , "% llu " , "% f " , "% f " lub "% Lf " , odpowiednio, gdziebuf
oznacza wewnętrzny bufor znaków o wystarczającej wielkości. "Rzuciłem okiem na standard C99 dla printf i myślę, że liczba miejsc dziesiętnych zależy od#define DECIMAL_DIG
wfloat.h .Jak przekonwertować liczbę na ciąg w C ++ 03
itoa
lubitof
funkcji, ponieważ są one nietypowe i dlatego nie przenośne.Użyj strumieni ciągów
Zwróć uwagę, że możesz używać strumieni ciągów również do konwersji liczb zmiennoprzecinkowych na łańcuchy, a także do formatowania łańcucha według własnego uznania, tak jak w przypadku
cout
Możesz używać manipulatorów strumieni, takich jak
std::endl
,std::hex
i funkcjestd::setw()
,std::setprecision()
itp. Ze strumieniami łańcuchów w dokładnie taki sam sposób, jak w przypadkucout
Nie myl
std::ostringstream
zstd::ostrstream
. Ta ostatnia jest przestarzałaUżyj wzmocnienia leksykalnego rzutowania . Jeśli nie jesteś zaznajomiony z boost, dobrym pomysłem jest rozpoczęcie od małej biblioteki, takiej jak ten lexical_cast. Aby pobrać i zainstalować Boost oraz jego dokumentację, przejdź tutaj . Chociaż boost nie jest w standardzie C ++, wiele bibliotek boost zostaje ostatecznie ustandaryzowanych, a boost jest powszechnie uważany za najlepsze biblioteki C ++.
Obsada leksykalna używa strumieni pod spodem, więc w zasadzie ta opcja jest taka sama jak poprzednia, tylko mniej szczegółowa.
Jak przekonwertować ciąg na liczbę w C ++ 03
Najlżejszą opcją, dziedziczoną z C, są funkcje
atoi
(dla liczb całkowitych (alfabetycznie do liczby całkowitej)) iatof
(dla wartości zmiennoprzecinkowych (alfabetycznie do liczby zmiennoprzecinkowej)). Te funkcje przyjmują ciąg znaków w stylu C jako argument (const char *
) i dlatego ich użycie może być uważane za niezbyt dobrą praktykę C ++. cplusplus.com ma łatwą do zrozumienia dokumentację zarówno na temat atoi, jak i atof, w tym jak zachowują się w przypadku złego wejścia. Jednak łącze zawiera błąd polegający na tym, że zgodnie ze standardem, jeśli liczba wejściowa jest zbyt duża, aby zmieścić się w typie docelowym, zachowanie jest niezdefiniowane.Użyj strumieni ciągów (tym razem wejściowego strumienia ciągów
istringstream
). Ponownie, istringstream jest używany tak samo jakcin
. Ponownie, nie mylistringstream
zistrstream
. Ta ostatnia jest przestarzała.Użyj wzmocnienia leksykalnego rzutowania .
W przypadku złego wejścia
lexical_cast
zgłasza wyjątek typuboost::bad_lexical_cast
źródło
atoi
nie jest doskonała, jest niepoprawna. Nie wspomina, że jeśli wartość liczbowa ciągu nie może być reprezentowana wint
, to zachowanie jest niezdefiniowane. Zamiast tego mówi, że wartości spoza zakresu są zaciskane naINT_MAX
/INT_MIN
, czego nie mogę znaleźć ani w C ++ 03, ani w C89. W przypadku niezaufanych / niezweryfikowanych danych wejściowych lub w przypadku baz, których strumienie nie obsługują, potrzebujeszstrtol
, które ma zdefiniowane zachowanie błędów. I podobne komentarze dlaatof
/strtod
.(int)strtol(nptr, (char **)NULL, 10)
. Funkcje atoi [...] zwracają przekonwertowaną wartość.”. cplusplus.com jest znane jako niesamowite źródło informacji dla początkujących.istr >> i1 >> f >> i2;
bardzo tęskni za czekiem na sukces.std::to_string
W C ++ 17 nowe funkcje std :: to_chars i std :: from_chars zostały wprowadzone w nagłówku charconv .
Od std :: to_chars , to samo dla std :: from_chars .
Chociaż nie jest w pełni zaimplementowany przez kompilatory, na pewno zostanie zaimplementowany.
źródło
Ukradłem tę wygodną klasę gdzieś tutaj w StackOverflow, aby przekonwertować wszystko, co można strumieniować na ciąg:
A potem używasz go jako;
Całkiem fajnie!
Używam również tej funkcji do konwersji łańcuchów znaków na wszystko, co można przesyłać strumieniowo, chociaż nie jest to zbyt bezpieczne, jeśli spróbujesz przeanalizować ciąg niezawierający liczby; (i nie jest tak sprytny jak ostatni)
Użyj jako:
Możesz także potrzebować wersji dla wstrings.
źródło