Konwersja typów danych

2016-11-14 16:04
Jacek Labudda
												Konwersję typów danych w C++ można wykonać na kilka sposobów, wykorzystując do tego również funkcję z języka C.

Po co?

Czasem może się zdarzyć, że musimy zmienić nasz typ danych, np. odebrany pakiet jest ciągiem znaków zapisanych w kodzie ASCII, więc odebrane dane zapisujemy do tablic znakowych, po czym nasz algorytm rozdziela dane na osobne wartości. Powiedzmy, że pakiet przechowywał nazwę gracza oraz jego pozycję. Zatem nazwa zostaje przekonwertowana na ciągu znaków, a pozycje należało by zapisać jako zmienna liczbowa, zatem konwertujemy tablicę znakową na zmienną liczbową w tym wypadku zapewne typu float.

Jakie są metody konwersji?

konwersja int na char

#include <cstdio> int main(){ int zmienna_liczbowa = 10; char zmienna_znakowa[2]; sprintf(zmienna_znakowa, "%i", zmienna_liczbowa); printf("Wynik: %s", zmienna_znakowa); return 0; }
Wynik: 10 Powyżej widzimy znowu nową bibliotekę. Dzięki bibliotece cstdio(wywodzącej się od poprzednika stdio.h z języka C) możemy korzystać z funkcji sprintf, printf, fprintf oraz z wielu innych. W kodzie widzimy dwie nowe funkcje, sprintf która zapisuje łączne dane do jednej tablicy znakowej. Jako pierwszy argument funkcji podajemy tablicę znakową, kolejnym argumentem jest ciąg znaków, który zawiera informacje dla funkcji, jakiego typu dane chcemy pobrać(parametr %i informuje funkcję programu, że chcemy pobrać zmienną typu int). Od trzeciego argumentu wzwyż podajemy dane, które będą przetwarzane przez funkcję i zostaną wpisane do tablicy znakowej. Funkcja printf wyświetla dane w trochę bardziej zaawansowany sposób niż cin. Pierwszy argument funkcji to ciąg znaków, działający na takiej samej zasadzie jak drugi argument w przypadku funkcji sprintf. Parametr %s informuje funkcję programu, że chcemy pobrać ciąg znaków. Kolejne argumenty to dane, które będą przetwarzane.

konwersja float na char

#include <cstdio> int main(){ float zmienna_liczbowa = 12.345678; char zmienna_znakowa[100]; sprintf(zmienna_znakowa, "%f", zmienna_liczbowa); printf("Wynik: %s", zmienna_znakowa); return 0; }
Wynik: 12.345678 Oprócz zmiennej zmienia nam się tylko parametr będący argumentem funkcji sprintf na %f. Ten parametr pobiera liczbę zmiennoprzecinkową o pojedynczej dokładności.

konwersja string na char

#include <cstdio> #include <string> using namespace std; int main(){ string ciag_znakow = "Witaj swiecie"; char zmienna_znakowa[100]; sprintf(zmienna_znakowa, "%s", ciag_znakow.c_str()); printf("Wynik: %s", zmienna_znakowa); return 0; }
Wynik: Witaj swiecie lub
#include <iostream> #include <cstring> using namespace std; int main(){ string ciag_znakow = "Witaj swiecie"; char zmienna_znakowa[100] ; strcpy(zmienna_znakowa, ciag_znakow.c_str()); cout << "Wynik: " << zmienna_znakowa << endl; return 0; }
Wynik: Witaj swiecie Funkcja strcpy pochodzi z biblioteki cstring i kopiuje dane z ciag_znakow.c_str() do zmienna_znakowa. Można również zamienić typ danych metodą podmieniania wartości pojedynczych tablic co nie jest preferowaną metodą.
#include <iostream> #include <string> #include <cstring> using namespace std; int main(){ string ciag_znakow = "Witaj swiecie"; char zmienna_znakowa[100]; memset(zmienna_znakowa, '\0', 100); for(int a=0; a<ciag_znakow.length(); a++) zmienna_znakowa[a] = ciag_znakow[a]; cout << "Wynik: " << zmienna_znakowa << endl; return 0; }
Wynik: Witaj swiecie Kolejna nowa funkcja memset z biblioteki cstring. Jej zadaniem w powyższym przykładzie jest wyczyszczenie tablicy. Ogólnym zadaniem tej funkcji jest zamiana pierwszych bajtów tablicy podanej jako pierwszy argument na wartość która została podana w argumencie drugim. Trzeci argument jest to liczba bajtów jakie zostaną zamienione. Następnym krokiem jest pętla, która zamienia tablicę po tablicy. Na końcu nasz wynik zostaje wyświetlony.

konwersja float na int

#include <iostream> using namespace std; int main(){ float liczba_zmiennoprzecinkowa = 12.345678; cout << "Wynik 1: " << liczba_zmiennoprzecinkowa << endl; cout << "Wynik 2: " << int(liczba_zmiennoprzecinkowa) << endl; return 0; }
Wynik 1: 12.3457 Wynik 2: 12 Powyższy przykład nie wymaga tłumaczeń :D.

konwersja wartości liczbowej na bool

#include <iostream> using namespace std; int main(){ bool wartosc_logiczna; wartosc_logiczna = 0; cout << "Wynik 1: " << wartosc_logiczna << endl; wartosc_logiczna = 10; cout << "Wynik 2: " << wartosc_logiczna << endl; return 0; }
Wynik 1: 0 Wynik 2: 1 Wartość logiczna może przechowywać tylko dwie wartości fałsz(false, 0) lub prawda(true, różne od 0). Zatem gdy przypiszemy do wartości logicznej liczbę 0 to będzie zwracała false(0) a gdy przypiszemy inną liczbę niż 0 to zmienna logiczna zwróci wartość true czyli wartość liczbową 1. Bardzo rzadko stosowana konwersja, ale warto wiedzieć, że jest taka możliwość.

konwersja wszystkich typów zmiennych do string

#include <iostream> #include <sstream> using namespace std; int main(){ int a = 1; float b = 2.2; double c= 2.22; char * d = "Witaj swiecie"; bool e = true; stringstream str; str << "int: " << a << "\nfloat: " << b << "\ndouble: " << c << "\nchar: " << d << "\nbool: " << e; string ciag_znakow = str.str(); cout << ciag_znakow << endl; return 0; }
int: 1 float: 2.2 double: 2.22 char: Witaj swiecie bool: 1 Najprostszym sposobem jest skorzystanie z dobrodziejstw biblioteki sstream. stringstream jest to klasa działająca na strumieniach ciągów znaków.

Podsumowanie

Jest to lekcja dodatkowa i nie zagłębiałem się w temat żadnej z podanej w tej lekcji bibliotek ani funkcji. Ukazałem tylko sposoby konwersji typów danych jakie można wykonać przy pomocy danych funkcji. To nie są oczywiście wszystkie możliwości konwersji, ukazałem te najczęściej stosowane nie tylko przeze mnie.

Użytkownicy
Logowanie:
Zaloguj
Polub nas na facebooku
Wyszukiwanie na stronie