Konwersja tekst - liczba

Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 10896 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:

char str_number[] = "1.23"; char str_from_number[20]; double l = 0.000002; sprintf(str_from_number,"%i",(int)l); // tutaj zamieniam liczbę typu int na tekst cout<<"Konwersja double l = "<<l<<" na tekst liczby calkowitej: "<<str_from_number; sprintf(str_from_number,"%f",l); // zamieniam liczbę typu float na tekst cout<<endl<<endl<<"Konwersja double l = "<<l<<" na tekst liczby float: "<<str_from_number; sprintf(str_from_number,"%lf",l); // zamieniam liczbę typu double na tekst cout<<endl<<endl<<"Konwersja double l = "<<l<<" na tekst liczby double: "<<str_from_number; sscanf(str_number,"%lf",&l); // wczytywanie liczby z tekstu do zmiennej typu double cout<<endl<<endl<<"Zamiana tekstu \apos"<<str_number<<"\apos na zmienna typu double "<<l; int i = 0; sscanf(str_number,"%i", &i); // wyczytywanie liczby z tekstu do zmienej typu int cout<<endl<<endl<<"Zamiana tekstu \apos"<<str_number<<"\apos na zmienna typu int "<<i; unsigned int ui = 0; sscanf(str_number,"%ui",&ui);// wyczytywanie liczby z tekstu do zmienej typu unsigned int cout<<endl<<endl<<"Zamiana tekstu \apos"<<str_number<<"\apos 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:

char str_number[] = "1.23"; char str_from_number[20]; int k = 10; int number = atol(str_number); // zamiana tekstu na liczbę typu int ltoa(k, // liczba typu int zamieniana na tekst str_from_number, // zmienna do której zostanie zwrócony wynik 10 // system liczbowy - w tym przypadku dziesiętny ); // zamiana liczby typu int na tekst w systemie dziesiętnym cout<<"Zmienna k="<<k<<" w sytemie dziesietnym "<<str_from_number<<endl; ltoa(k,str_from_number,8); // zamiana w systemie ósemkowym cout<<"Zmienna k="<<k<<" w sytemie osemkowym "<<str_from_number<<endl; ltoa(k,str_from_number,2); // dwójkowym cout<<"Zmienna k="<<k<<" w sytemie dwojkowym "<<str_from_number<<endl; ltoa(k,str_from_number,16); // szesnastkowym cout<<"Zmienna k="<<k<<" w sytemie szesnastkowym "<<str_from_number<<endl; cout<<"liczba wyciagnieta z zmiennej str_number=\apos"<<str_number<<"\apos 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:

char str_number[] = "1.23"; char str_from_number[20]; double number = atof(str_number); // zamiana tekstu na liczbę typu double cout<<"Zmienna tekstowa str_number=\apos"<<str_number<<"\apos zamieniona na liczbe typu double: "<<number<<endl<<endl; _gcvt(number, // zamieniana liczba 10, // precyzja str_from_number // bufor, do którego zwrócony zostanie wynik ); // zamiana zmiennej typu double na tekst cout<<"Liczba typu double "<<number<<" zamieniona na tekst \apos"<<str_from_number<<"\apos"<<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:

char str_number[] = "1.23tekst"; char * stopstring; double n = strtod(str_number,&stopstring); cout<<"Zmienna tekstowa str_number=\apos"<<str_number<<"\apos zamieniona na liczbe typu double "<<n<<" z wykryciem na koncu takiego oto tekstu nie pasujacego do typu liczbowego: \apos"<<stopstring<<"\apos"<<endl<<endl; float fn = strtof(str_number,&stopstring); cout<<"Zmienna tekstowa str_number=\apos"<<str_number<<"\apos zamieniona na liczbe typu float "<<fn<<" z wykryciem na koncu takiego oto tekstu nie pasujacego do typu liczbowego: \apos"<<stopstring<<"\apos"<<endl<<endl; int in = strtol(str_number, // tekst zamieniany &stopstring, // końcówka tekstu nie pasująca do typu liczbowego 10 // system liczbowy (w tym przypadku dziesiętny ); // zamiana tekstu na liczbę typu int cout<<"Zmienna tekstowa str_number=\apos"<<str_number<<"\apos zamieniona na liczbe typu int "<<in<<" z wykryciem na koncu takiego oto tekstu nie pasujacego do typu liczbowego: \apos"<<stopstring<<"\apos"<<endl<<endl; unsigned int uin = strtoul(str_number, // tekst zamieniany &stopstring, // końcówka tekstu nie pasująca do typu liczbowego 10 // system liczbowy (w tym przypadku dziesiętny ); // zamiana tekstu na liczbę typu int cout<<"Zmienna tekstowa str_number=\apos"<<str_number<<"\apos zamieniona na liczbe typu unsigned int "<<uin<<" z wykryciem na koncu takiego oto tekstu nie pasujacego do typu liczbowego: \apos"<<stopstring<<"\apos";

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:

std::string & operator +=(std::string &tekst, int value){ char c[50]; _ltoa(value,c,10); tekst += c; return tekst; } std::string & operator +=(std::string &tekst, double value){ char c[50]; _gcvt(value,20,c); if(c[strlen(c)-1] == '.') c[strlen(c)-1] = 0; tekst += c; return tekst; }

Użycie takiego przeciążonego operatora:

int k = 100; double dbl_k = 0.12; string str; str += k; str += "; "; str += dbl_k; str += ";"; cout<<str;

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

100; 0.12;
Propozycje książek