Konwersja z float na string

0

Witam, tworzę powoli swój pierwszy kalkulator, bazując na różnych poradnikach, wiedzy z innych języków webowych udało mi się dojść do takiego efektu, że kalkulator liczy, lecz mam problem z konwertowanie floata do stringa.

Dokładnie w tych linijkach mam problem z konwertowaniem z float na string, gdyz nie ma takiej funkcji jak ftoa, jak rozwiązać ten problem ? A chcialbym, zeby kalkulator liczyl tez liczby z przecinkiem

  if((HWND)lParam == hrowna)
    {
          if(Znak==1)liczba+=Liczba1;
          if(Znak==2)liczba-=Liczba1;
          if(Znak==3)liczba/=Liczba1;
          if(Znak==4)liczba*=Liczba1;
       SetWindowText(hText,"");
       char str[10000] = {0};
       itoa(liczba, str, 10);
       SendMessage(hText, EM_REPLACESEL, 0, reinterpret_cast<LPARAM>(str));
       Znak=0;
       n=1;

   }

   if((HWND)lParam == hdziel)
    {
        // dzielenie
       SetWindowText(hText,"");

        liczba = Liczba1;
        char str[10000] = {0};
        itoa(liczba, str, 10);
        SendMessage(hText, EM_REPLACESEL, 0, reinterpret_cast<LPARAM>(str));
       SetWindowText(hText,"");
              n=1;
       Znak = 3;
   }
  if((HWND)lParam == hmno)
    {
        // *
       SetWindowText(hText,"");

        liczba = Liczba1;
        char str[10000] = {0};
        itoa(liczba, str, 10);
        SendMessage(hText, EM_REPLACESEL, 0, reinterpret_cast<LPARAM>(str));
       SetWindowText(hText,"");
              n=1;
       Znak = 4;
   }
  if((HWND)lParam == hodej)
    {
        // -
       SetWindowText(hText,"");

        liczba+=Liczba1;
        char str[10000] = {0};
        itoa(liczba, str, 10);
        SendMessage(hText, EM_REPLACESEL, 0, reinterpret_cast<LPARAM>(str));
       SetWindowText(hText,"");
            n=1;
       Znak = 2;
   }

Tutaj zamieszczam cały kod programu

 #include <windows.h>
#include <iostream>
#include <stdlib.h>

char Znak;
double liczba = 0;
double Liczba1 = 0;
double Liczba2 = 0;
double n = 1;
char buffor[100000];





char *sZnak(char* val)
{

        if (n)
        {
                buffor[0] = 0;
                n = 0;
        }

        if (strlen(buffor) < 100000)
        {
                strcat(&buffor[0], val);
                return buffor;
        }
}
LPSTR NazwaKlasy = "randomtxt";
MSG Komunikat;// zmienna do przechowywania komunikatów

LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ); // format w jakim wprowadzane są dane do okienek
 HWND hwnd,h1,h2,h3,h4,h5,h6,h7,h8,h9,h0,hdod,hkropka,hrowna,hmno,hodej,hdziel,hclr,hText;

char* aText;
char aZnak;
char aLiczba;
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) //odpowiednik main()
{

    // WYPE£NIANIE STRUKTURY
    WNDCLASSEX wc;

    wc.cbSize = sizeof( WNDCLASSEX ); //	Rozmiar struktury w bajtach. Nale¿y tu wpisaæ sizeof (WINDOWCLASSEX)
    wc.style = 0; //styl klasy
    wc.lpfnWndProc = WndProc; // obsluga okienek
    wc.cbClsExtra = 0; //bajty dla klasy, najlepiej ustawic 0
    wc.cbWndExtra = 0; //bajty dla klasy, najlepiej ustawic 0
    wc.hInstance = hInstance; //pierwszy parametr funkcji WinMain
    wc.hIcon = LoadIcon( NULL, IDI_APPLICATION ); // duza ikonka (alt-tab)
    wc.hCursor = LoadCursor( NULL, IDC_ARROW ); //kursor myszki standardowy
    wc.hbrBackground =( HBRUSH )( COLOR_WINDOW + 1 ); // kolor t³a
    wc.lpszMenuName = NULL; // do menu, póki co jeszcze siê tego nie uczy³em.
    wc.lpszClassName = NazwaKlasy; //nazwa klasy
    wc.hIconSm = LoadIcon( NULL, IDI_APPLICATION ); // ma³a ikonka

    // REJESTROWANIE KLASY OKNA, wymagane w kazdym programie w winapi
    if( !RegisterClassEx( & wc ) )
    {
        MessageBox( NULL, "x", "x",
        MB_ICONEXCLAMATION | MB_OK );
        return 1;
    }

    // TWORZENIE OKNA


    hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, NazwaKlasy, "Kalkulator", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 320, 480, NULL, NULL, hInstance, NULL );
h1 = CreateWindowEx(0, "BUTTON", "1", WS_CHILD | WS_VISIBLE, 0, 80, 40, 40, hwnd, NULL, hInstance, NULL);
h2 = CreateWindowEx(0, "BUTTON", "2", WS_CHILD | WS_VISIBLE, 40, 80, 40, 40, hwnd, NULL , hInstance, NULL);
h3 = CreateWindowEx(0, "BUTTON", "3", WS_CHILD | WS_VISIBLE, 80, 80, 40, 40, hwnd, NULL, hInstance, NULL);
h4 = CreateWindowEx(0, "BUTTON", "4", WS_CHILD | WS_VISIBLE, 0, 120, 40, 40, hwnd, NULL, hInstance, NULL);
h5 = CreateWindowEx(0, "BUTTON", "5", WS_CHILD | WS_VISIBLE, 40, 120, 40, 40, hwnd, NULL, hInstance, NULL);
h6 = CreateWindowEx(0, "BUTTON", "6", WS_CHILD | WS_VISIBLE, 80, 120, 40, 40, hwnd, NULL, hInstance, NULL);
h7 = CreateWindowEx(0, "BUTTON", "7", WS_CHILD | WS_VISIBLE, 0, 160, 40, 40, hwnd, NULL, hInstance, NULL);
h8 = CreateWindowEx(0, "BUTTON", "8", WS_CHILD | WS_VISIBLE, 40, 160, 40, 40, hwnd, NULL, hInstance, NULL);
h9 = CreateWindowEx(0, "BUTTON", "9", WS_CHILD | WS_VISIBLE, 80, 160, 40, 40, hwnd, NULL, hInstance, NULL);
h0 = CreateWindowEx(0, "BUTTON", "0", WS_CHILD | WS_VISIBLE, 0, 200, 80, 40, hwnd,NULL, hInstance, NULL);
hclr = CreateWindowEx(0, "BUTTON", "CLR", WS_CHILD | WS_VISIBLE, 80, 200, 40, 40, hwnd,NULL, hInstance, NULL);
hrowna = CreateWindowEx(0, "BUTTON", "=", WS_CHILD | WS_VISIBLE, 120, 80, 40, 160, hwnd,NULL, hInstance, NULL);
hmno = CreateWindowEx(0, "BUTTON", "*", WS_CHILD | WS_VISIBLE, 80, 40, 40, 40, hwnd,NULL, hInstance, NULL);
hodej = CreateWindowEx(0, "BUTTON", "-", WS_CHILD | WS_VISIBLE, 120, 40, 40, 40, hwnd,NULL, hInstance, NULL);
hdziel = CreateWindowEx(0, "BUTTON", "/", WS_CHILD | WS_VISIBLE, 40, 40, 40, 40, hwnd,NULL, hInstance, NULL);
hdod = CreateWindowEx(0, "BUTTON", "+", WS_CHILD | WS_VISIBLE, 0, 40, 40, 40, hwnd,NULL, hInstance, NULL);
hkropka = CreateWindowEx(0, "BUTTON", ".", WS_CHILD | WS_VISIBLE, 160, 160, 40, 40, hwnd,NULL, hInstance, NULL);
hText = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER,NULL, NULL, 160, 40, hwnd, NULL, hInstance, NULL );
SetWindowText(hText, "");
    if( hwnd == NULL )
    {
        MessageBox( NULL, "blad", "blad", MB_ICONEXCLAMATION );
        return 1;
    }

    ShowWindow( hwnd, nCmdShow ); // Pokazuje okienko...
    UpdateWindow( hwnd ); // upewnia sie czy okienko zostało dobrze pokazane

    // Pêtla komunikatów
    while( GetMessage( & Komunikat, NULL, 0, 0 ) ) // petla wymagana do poprawnej obslugi okienek, odpowiada, za ciagłe wczytywanie danych.
    {
        TranslateMessage( & Komunikat );
        DispatchMessage( & Komunikat );
    }
    return Komunikat.wParam;
}

// OBS£UGA ZDARZEÑ
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_COMMAND:
  if((HWND)lParam == h1)
    {
       aText="1"; //przypisywanie wartosci zmiennej atext, jako string, dlatego w uszach
       SendMessage(hText, EM_REPLACESEL, 0, (LPARAM)aText);// wysylanie wartosci do okienka tekstowego
       Liczba1=atof(sZnak("1")); // konwertowanie zmiennej string na zmienna typu float
   }
  if((HWND)lParam == h2)
    {
       aText="2"; //przypisywanie wartosci zmiennej atext, jako string, dlatego w uszach
       SendMessage(hText, EM_REPLACESEL, 0, (LPARAM)aText);// wysylanie wartosci do okienka tekstowego
       Liczba1=atof(sZnak("2")); // konwertowanie zmiennej string na zmienna typu float
   }
   if((HWND)lParam == h3)
    {
       aText="3"; //przypisywanie wartosci zmiennej atext, jako string, dlatego w uszach
       SendMessage(hText, EM_REPLACESEL, 0, (LPARAM)aText);// wysylanie wartosci do okienka tekstowego
       Liczba1=atof(sZnak("3")); // konwertowanie zmiennej string na zmienna typu float
   }
   if((HWND)lParam == h4)
    {
       aText="4"; //przypisywanie wartosci zmiennej atext, jako string, dlatego w uszach
       SendMessage(hText, EM_REPLACESEL, 0, (LPARAM)aText);// wysylanie wartosci do okienka tekstowego
       Liczba1=atof(sZnak("4")); // konwertowanie zmiennej string na zmienna typu float
   }
   if((HWND)lParam == h5)
    {
       aText="5"; //przypisywanie wartosci zmiennej atext, jako string, dlatego w uszach
       SendMessage(hText, EM_REPLACESEL, 0, (LPARAM)aText);// wysylanie wartosci do okienka tekstowego
       Liczba1=atof(sZnak("5")); // konwertowanie zmiennej string na zmienna typu float
    }
   if((HWND)lParam == h6)
    {
       aText="6"; //przypisywanie wartosci zmiennej atext, jako string, dlatego w uszach
       SendMessage(hText, EM_REPLACESEL, 0, (LPARAM)aText);// wysylanie wartosci do okienka tekstowego
       Liczba1=atof(sZnak("6")); // konwertowanie zmiennej string na zmienna typu float
   }
   if((HWND)lParam == h7)
    {
       aText="7"; //przypisywanie wartosci zmiennej atext, jako string, dlatego w uszach
       SendMessage(hText, EM_REPLACESEL, 0, (LPARAM)aText);// wysylanie wartosci do okienka tekstowego
       Liczba1=atof(sZnak("7")); // konwertowanie zmiennej string na zmienna typu float
   }
   if((HWND)lParam == h8)
    {
       aText="8"; //przypisywanie wartosci zmiennej atext, jako string, dlatego w uszach
       SendMessage(hText, EM_REPLACESEL, 0, (LPARAM)aText);// wysylanie wartosci do okienka tekstowego
       Liczba1=atof(sZnak("8")); // konwertowanie zmiennej string na zmienna typu float
   }
   if((HWND)lParam == h9)
    {
       aText="9"; //przypisywanie wartosci zmiennej atext, jako string, dlatego w uszach
       SendMessage(hText, EM_REPLACESEL, 0, (LPARAM)aText);// wysylanie wartosci do okienka tekstowego
       Liczba1=atof(sZnak("9")); // konwertowanie zmiennej string na zmienna typu float
   }
   if((HWND)lParam == h0)
    {
       aText="0"; //przypisywanie wartosci zmiennej atext, jako string, dlatego w uszach
       SendMessage(hText, EM_REPLACESEL, 0, (LPARAM)aText);// wysylanie wartosci do okienka tekstowego
       Liczba1=atof(sZnak("0")); // konwertowanie zmiennej string na zmienna typu float
   }

    if((HWND)lParam == hdod)
    {
        // dodawanie
       SetWindowText(hText,"");
        char str[10000] = {0};//dokladnosc konwersji
        liczba+=Liczba1; //operator przypisywania, skrot od liczba = liczba+ liczba1;
        itoa(liczba, str, 10); //konwertowanie ciagu znakow, czyli, jesli klikne dwa razy jedynke to jest to 11, a nie 1.
        SendMessage(hText, EM_REPLACESEL, 0, reinterpret_cast<LPARAM>(str));
       SetWindowText(hText,"");
       n=1;
       Znak = 1;
   }
    if((HWND)lParam == hkropka)
    {
       aText="."; //przypisywanie wartosci zmiennej atext, jako string, dlatego w uszach
       SendMessage(hText, EM_REPLACESEL, 0, (LPARAM)aText);// wysylanie wartosci do okienka tekstowego
       Liczba1=atof(sZnak(".")); // konwertowanie zmiennej string na zmienna typu float
   }
   if((HWND)lParam == hrowna)
    {
          if(Znak==1)liczba+=Liczba1;
          if(Znak==2)liczba-=Liczba1;
          if(Znak==3)liczba/=Liczba1;
          if(Znak==4)liczba*=Liczba1;
       SetWindowText(hText,"");
       char str[10000] = {0};
       itoa(liczba, str, 10);
       SendMessage(hText, EM_REPLACESEL, 0, reinterpret_cast<LPARAM>(str));
       Znak=0;
       n=1;

   }

   if((HWND)lParam == hdziel)
    {
        // dzielenie
       SetWindowText(hText,"");

        liczba = Liczba1;
        char str[10000] = {0};
        itoa(liczba, str, 10);
        SendMessage(hText, EM_REPLACESEL, 0, reinterpret_cast<LPARAM>(str));
       SetWindowText(hText,"");
              n=1;
       Znak = 3;
   }
  if((HWND)lParam == hmno)
    {
        // *
       SetWindowText(hText,"");

        liczba = Liczba1;
        char str[10000] = {0};
        itoa(liczba, str, 10);
        SendMessage(hText, EM_REPLACESEL, 0, reinterpret_cast<LPARAM>(str));
       SetWindowText(hText,"");
              n=1;
       Znak = 4;
   }
  if((HWND)lParam == hodej)
    {
        // -
       SetWindowText(hText,"");

        liczba+=Liczba1;
        char str[10000] = {0};
        itoa(liczba, str, 10);
        SendMessage(hText, EM_REPLACESEL, 0, reinterpret_cast<LPARAM>(str));
       SetWindowText(hText,"");
            n=1;
       Znak = 2;
   }
   if((HWND)lParam == hclr)
    {
        SetWindowText(hText, "");
        liczba = 0;
        n=1;
   }


break;

    case WM_CLOSE:
        DestroyWindow( hwnd );
        break;

    case WM_DESTROY:
        PostQuitMessage( 0 );
        break;

        default:
        return DefWindowProc( hwnd, msg, wParam, lParam );
    }

    return 0;
}
0

Użyj zwykłego sprintf'a

0
 if((HWND)lParam == hdod)
    {
        // dodawanie
       SetWindowText(hText,"");
        char str[10000] = {0};//dokladnosc konwersji
        liczba+=Liczba1; //operator przypisywania, skrot od liczba = liczba+ liczba1;
        sprintf(str,"liczba = %f\n",liczba);
        SendMessage(hText, EM_REPLACESEL, 0, reinterpret_cast<LPARAM>(str));
       SetWindowText(hText,"");
       n=1;
       Znak = 1;
   }

cos takiego ?

0

To jeszcze dodam że jak możesz użyć boost'a, to lexical_cast z jest wydajniejszy niż print w większości zastosowań.
Doc: http://www.boost.org/doc/libs/1_55_0/doc/html/boost_lexical_cast.html
Porównanie: http://www.boost.org/doc/libs/1_55_0/doc/html/boost_lexical_cast/performance.html

0

@Mokrowski, czyli jak mam to zamienić w tym kodzie? Bo nie ogarniam ani funkcj sprintf, ani tych co podałeś, a musze jak najszybciej oddać ten program.

if((HWND)lParam == hdod)
    {
        // dodawanie
       SetWindowText(hText,"");
        char str[10000] = {0};//dokladnosc konwersji
        liczba+=Liczba1; //operator przypisywania, skrot od liczba = liczba+ liczba1;
         ftoa(liczba, str, 10);
        SendMessage(hText, EM_REPLACESEL, 0, reinterpret_cast<LPARAM>(str));
       SetWindowText(hText,"");
       n=1;
       Znak = 1;
   }
0

Nie pchaj tego czego nie wiesz wszędzie gdzie popadnie:

        char str[32];
        liczba+=Liczba1;
        sprintf(str,"%f",liczba);
        SetWindowText(hText,str);
        n=1;
        Znak = 1;
1

skoro to C++ to czemu nie std::to_string()?

1 użytkowników online, w tym zalogowanych: 0, gości: 1