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: