Na forum 4programmers.net korzystamy z plików cookies. Część z nich jest niezbędna do funkcjonowania
naszego forum, natomiast wykorzystanie pozostałych zależy od Twojej dobrowolnej zgody, którą możesz
wyrazić poniżej. Klikając „Zaakceptuj Wszystkie” zgadzasz się na wykorzystywanie przez nas plików cookies
analitycznych oraz reklamowych, jeżeli nie chcesz udzielić nam swojej zgody kliknij „Tylko niezbędne”.
Możesz także wyrazić swoją zgodę odrębnie dla plików cookies analitycznych lub reklamowych. W tym celu
ustaw odpowiednio pola wyboru i kliknij „Zaakceptuj Zaznaczone”. Więcej informacji o technologii cookie
znajduje się w naszej polityce prywatności.
Powyższa metoda niestety nie wyświetla mi żadnego napisu. Spróbowałem jeszcze zrobić tak:
Kopiuj
constchar* val =(std::to_string(data.dx.vol)).c_str();char valC[6];for(int i =0; i <5; i++){
valC[0]=*(val + i);}
i valC przekazać do funkcji ale niestety też nie działa. Natomiast jeżeli napiszę valC[6] = "12.34" i to przekażę jako parametr do funkcji to się wyświetla. Musi więc być to wina konwersji i prawdopodobnie jak twonek wyżej wspomniał pewnie coś z tym wskaźnikiem jest nie tak.
no i dla wartości 2.567725.677256.772567.7 nie dostaniesz oczekiwanego wyniku: 2.5725.68256.772567.70. Nawet jak policzysz to 5 to i tak zaokrąglanie przepada.
Wiem, znam słabości tego jednolinijkowca. Post napisałem na szybko na podstawie prób autora, setpresicion pojawiło się wyżej więc założyłem że autor jest go świadomy.
Usunąć wpis?
Tej operacji nie będzie można cofnąć.
vpiotr
vpiotr
Rejestracja:ponad 13 lat
Ostatnio:prawie 3 lata
1
Miks pierwszej i ostatniej wersji:
Kopiuj
#include<iostream>#include<sstream>#include<iomanip>usingnamespace std;voidmyFunc(constchar*strFloat){
cout <<"myFunc: ";while(*strFloat){
cout <<*(strFloat++);}
cout << endl;}intmain(){constfloat var =12.34;
ostringstream ss;
ss << std::fixed <<setprecision(2)<< var;myFunc(ss.str().c_str());return0;}
Jak dla mnie metoda z format stringiem jest tutaj czytelniejsza, strzelałbym też, że szybsza.
A sposób zaprezentowany w innych miejscach, t.j. wywoływanie .c_str() na obiekcie tymczasowym jest szalenie zdradliwy. Czas życia danych wskazywanych przez ten wskaźnik jest równy czasowi życia obiektu tymczasowego, więc nawet jeśli @several i @vpiotr zastosowali go poprawnie, to bardzo bym odradzał jego stosowanie w praktyce. Szczególnie przez mniej doświadczonych programistów.
Też nie lubię, ale różnica czytelności jest w mojej opinii dość wyraźna na korzyść rozwiązania rodem z C.
vpiotr
Można jeszcze dodać, że c_str() wywołane na obiekcie nie-tymczasowym też może być zdradliwe (wartość może się zdezaktualizować po zmianie wartości łańcucha "out").
właściwie jedyne co można bezpiecznie zrobić z c_str() to przekazać do funkcji. a i to pod warunkiem, że funkcja nie zapisuje tego wskaźnika na później.
W jaki sposób mogę przekonwertować zmienną float na const char* ?
Zrobiłem coś takiego:
Kopiuj
float var =12.34(std::to_string(var)).c_str()
i to nawet działa, tylko że w wyniku tej operacji dostaję 21.3400000, a potrzebuję tylko dwie cyfry po przecinku.
liczba zmiennoprzecinkowa nie ma takiej czy innej ilości cyfr po przecinku. Jest po prostu liczbą, w rzeczywistości binarną. Wypadało by odróżniać liczbę od jej widzialnego formatowania na 'outpucie'.
Co więcej, niektóre liczby nie istnieją (problem reprezentacji).
Przykładowa** float 12.34** też** nie istnieje**. jej "bardziej prawdziwa" wartość to 12.3400002 (może jakaś inna platforma wyliczy przykładowo 12.339997).
Niestety wiedza o zmiennym przecinku kiedyś tak podstawowa, jakoś zanikła wśród mas programistycznych. To czasem może skopać pewną część ciała. Jeszcze o ograniczonej dokładności ktoś by sobie coś przypomniał, o problemie reprezentacji nieliczni. Zarówno biblioteki, a zwłaszcza IDE robią MSZ krzywdę jak prezentują liczby zbyt "przyjaźnie" (a fałszywe)
Użyta w innym miejscu liczba to 21.3400002.
Zgadzam się z kolegami, którzy przestrzegają przed c_str() itd, te fragmenty są pełne UB/ błedów... ale mi to dodatkowo pachnie jakimś problemem XY
c_str()
to niebezpieczna praktyka. Ten wskaźnik może już nie wskazywać na nic sensownego w momencie użycia.