Konwersja tekst - liczba

Stronę tą wyświetlono już: 354 razy

Funkcje sprintf i sscanf

Pierwszym z sposobów konwersji tekst ↔ liczba jest użycie funkcji sprintf i sscanf, które dostępne są po załączeniu biblioteki stdio.h. Oto przykładowy kod zamiany tekstu na liczbę i na odwrót:

Listing 1
  1. char str_number[] = "1.23";
  2. char str_from_number[20];
  3. double l = 0.000002;
  4. sprintf(str_from_number,"%i",(int)l); // tutaj zamieniam liczbę typu int na tekst
  5. cout<<"Konwersja double l = "<<l<<" na tekst liczby calkowitej: "<<str_from_number;
  6. sprintf(str_from_number,"%f",l); // zamieniam liczbę typu float na tekst
  7. cout<<endl<<endl<<"Konwersja double l = "<<l<<" na tekst liczby float: "<<str_from_number;
  8. sprintf(str_from_number,"%lf",l); // zamieniam liczbę typu double na tekst
  9. cout<<endl<<endl<<"Konwersja double l = "<<l<<" na tekst liczby double: "<<str_from_number;
  10. sscanf(str_number,"%lf",&l); // wczytywanie liczby z tekstu do zmiennej typu double
  11. cout<<endl<<endl<<"Zamiana tekstu \""<<str_number<<"\" na zmienna typu double "<<l;
  12. int i = 0;
  13. sscanf(str_number,"%i", &i); // wyczytywanie liczby z tekstu do zmienej typu int
  14. cout<<endl<<endl<<"Zamiana tekstu \""<<str_number<<"\" na zmienna typu int "<<i;
  15. unsigned int ui = 0;
  16. sscanf(str_number,"%ui",&ui);// wyczytywanie liczby z tekstu do zmienej typu unsigned int
  17. cout<<endl<<endl<<"Zamiana tekstu \""<<str_number<<"\" na zmienna typu unsigned int "<<ui;

Wynik działania powyższego kodu:

Konwersja double l = 2e-006 na tekst liczby calkowitej: 0

Konwersja double l = 2e-006 na tekst liczby float: 0.000002

Konwersja double l = 2e-006 na tekst liczby double: 0.000002

Zamiana tekstu "1.23" na zmienna typu double 1.23

Zamiana tekstu "1.23" na zmienna typu int 1

Zamiana tekstu "1.23" na zmienna typu unsigned int 1

Funkcje atol i ltoa

Funkcja atol umożliwia konwersję zmiennej typu int na tekst const char*, natomiast funkcja ltoa konwersję odwrotną. W celu korzystania z tych funkcji należy zainkludować plik nagłówkowy stdlib.h. Oto prosty przykład użycia tych dwóch funkcji:

Listing 2
  1. char str_number[] = "1.23";
  2. char str_from_number[20];
  3. int k = 10;
  4. int number = atol(str_number); // zamiana tekstu na liczbę typu int
  5. ltoa(k, // liczba typu int zamieniana na tekst
  6. str_from_number, // zmienna do której zostanie zwrócony wynik
  7. 10 // system liczbowy - w tym przypadku dziesiętny
  8. ); // zamiana liczby typu int na tekst w systemie dziesiętnym
  9. cout<<"Zmienna k="<<k<<" w sytemie dziesietnym "<<str_from_number<<endl;
  10. ltoa(k,str_from_number,8); // zamiana w systemie ósemkowym
  11. cout<<"Zmienna k="<<k<<" w sytemie osemkowym "<<str_from_number<<endl;
  12. ltoa(k,str_from_number,2); // dwójkowym
  13. cout<<"Zmienna k="<<k<<" w sytemie dwojkowym "<<str_from_number<<endl;
  14. ltoa(k,str_from_number,16); // szesnastkowym
  15. cout<<"Zmienna k="<<k<<" w sytemie szesnastkowym "<<str_from_number<<endl;
  16. cout<<"liczba wyciagnieta z zmiennej str_number=\""<<str_number<<"\" zamieniona na liczbe typu int: "<<number;

Wynik działania powyższego kodu powinien być następujący:

Zmienna k=10 w sytemie dziesietnym 10
Zmienna k=10 w sytemie osemkowym 12
Zmienna k=10 w sytemie dwojkowym 1010
Zmienna k=10 w sytemie szesnastkowym a
liczba wyciagnieta z zmiennej str_number="1.23" zamieniona na liczbe typu int: 1

Funkcje atof, _gcvt

Funkcja atof zamienia tekst na liczbę typu double, _gcvt zamienia zmienną typu double na tekst. Poniżej zamieszczam przykład użycia tych funkcji:

Listing 3
  1. char str_number[] = "1.23";
  2. char str_from_number[20];
  3. double number = atof(str_number); // zamiana tekstu na liczbę typu double
  4. cout<<"Zmienna tekstowa str_number=\""<<str_number<<"\" zamieniona na liczbe typu double: "<<number<<endl<<endl;
  5. _gcvt(number, // zamieniana liczba
  6. 10, // precyzja
  7. str_from_number // bufor, do którego zwrócony zostanie wynik
  8. ); // zamiana zmiennej typu double na tekst
  9. cout<<"Liczba typu double "<<number<<" zamieniona na tekst \""<<str_from_number<<"\""<<endl<<endl;

Powyższy kod wyświetlić powinien:

Zmienna tekstowa str_number="1.23" zamieniona na liczbę typu double: 1.23

Liczba typu double 1.23 zamieniona na tekst "1.23"

Funkcje strtod, strtol, strtoul

Kolejna rodzinka funkcji strtod (string to double) tekst konwertuje na typ double, strtol (string to long) tekst konwertuje na typ int oraz strtoul (string to unsigned long) tekst konwertuje na typ unsigned int. Te funkcje wykrywają tekst, który nie pasuje do danego typu liczbowego i zwracają wskaźnik do miejsca, w którym tekst nie zawiera poprawnej wartości. Oto przykładowy kod:

Listing 4
  1. char str_number[] = "1.23tekst";
  2. char * stopstring;
  3. double n = strtod(str_number,&stopstring);
  4. cout<<"Zmienna tekstowa str_number=\""<<str_number<<"\" zamieniona na liczbe typu double "<<n<<" z wykryciem na koncu takiego oto tekstu nie pasujacego do typu liczbowego: \""<<stopstring<<"\""<<endl<<endl;
  5. float fn = strtof(str_number,&stopstring);
  6. cout<<"Zmienna tekstowa str_number=\""<<str_number<<"\" zamieniona na liczbe typu float "<<fn<<" z wykryciem na koncu takiego oto tekstu nie pasujacego do typu liczbowego: \""<<stopstring<<"\""<<endl<<endl;
  7. int in = strtol(str_number, // tekst zamieniany
  8. &stopstring, // końcówka tekstu nie pasująca do typu liczbowego
  9. 10 // system liczbowy (w tym przypadku dziesiętny
  10. ); // zamiana tekstu na liczbę typu int
  11. cout<<"Zmienna tekstowa str_number=\""<<str_number<<"\" zamieniona na liczbe typu int "<<in<<" z wykryciem na koncu takiego oto tekstu nie pasujacego do typu liczbowego: \""<<stopstring<<"\""<<endl<<endl;
  12. unsigned int uin = strtoul(str_number, // tekst zamieniany
  13. &stopstring, // końcówka tekstu nie pasująca do typu liczbowego
  14. 10 // system liczbowy (w tym przypadku dziesiętny
  15. ); // zamiana tekstu na liczbę typu int
  16. cout<<"Zmienna tekstowa str_number=\""<<str_number<<"\" zamieniona na liczbe typu unsigned int "<<uin<<" z wykryciem na koncu takiego oto tekstu nie pasujacego do typu liczbowego: \""<<stopstring<<"\"";

Powyższy kod powinien wyświetlić następujący wynik:

Zmienna tekstowa str_number="1.23tekst" zamieniona na liczbe typu double 1.23 z wykryciem na koncu takiego oto tekstu nie pasujacego do typu liczbowego: "tekst"

Zmienna tekstowa str_number="1.23tekst" zamieniona na liczbe typu float 1.23 z wykryciem na koncu takiego oto tekstu nie pasujacego do typu liczbowego: "tekst"

Zmienna tekstowa str_number="1.23tekst" zamieniona na liczbe typu int 1 z wykryciem na koncu takiego oto tekstu nie pasujacego do typu liczbowego: ".23tekst"

Zmienna tekstowa str_number="1.23tekst" zamieniona na liczbe typu unsigned int 1 z wykryciem na koncu takiego oto tekstu nie pasujacego do typu liczbowego: ".23tekst"

Przeciążanie operatora += dla klasy string

W celu umilenia sobie życia można przeciążyć operator += dla klasy string w następujący sposób:

Listing 5
  1. std::string & operator +=(std::string &tekst, int value){
  2. char c[50];
  3. _ltoa(value,c,10);
  4. tekst += c;
  5. return tekst;
  6. }
  7. std::string & operator +=(std::string &tekst, double value){
  8. char c[50];
  9. _gcvt(value,20,c);
  10. if(c[strlen(c)-1] == '.')
  11. c[strlen(c)-1] = 0;
  12. tekst += c;
  13. return tekst;
  14. }

Użycie takiego przeciążonego operatora:

Listing 6
  1. int k = 100;
  2. double dbl_k = 0.12;
  3. string str;
  4. str += k;
  5. str += "; ";
  6. str += dbl_k;
  7. str += ";";
  8. cout<<str;

Powinno wyświetlić następujący wynik:

100; 0.12;

Komentarze