C++ Konwersja typu int na char


(Tomo8813) #1

Siemanko. Ostatnio próbuje zrobić projekt na zaliczenie mojego przedmiotu na studyjkach i natknąłem się na mały, choć jak dla mnie w ogóle nie zrozumiały błąd konwersji opisanej w tytule. Oczywiście całego kodu wrzucać tu nie będę więc tylko mały prosty programik który odzwierciedla to czego tak naprawdę do szczęścia mi potrzeba. Mianowicie:

#include 

using namespace std;



int main()

{

char tab[5];

int i(2);


char a;

a = (char)i;


tab[0] = ((char)i);


cout<
system("pause");

}

[/code]

Przyznam że jak dla mnie linijka a = (char)i; bądź tab[0] = ((char)i); jest dla mnie jak najbardziej poprawna gdyż dokonuje jawnej konwersji typu (w duł). Natomiast przy wypisaniu elementu tablicy bądź zwykłego obiektu dostaje jakieś głupoty a nie jak bym tego chciał pożądany przeze mnie znak. Jeśli można was prosić o pomoc panowie programiści będę wam naprawdę ogromnie wdzięczny ... Ja jakoś nie mogę się tego nigdzie doczytać. Wszędzie znajduję regułę jaką wymieniłem powyżej.

Pozdrawiam.


(Sawyer47) #2

A jakiego spodziewasz się wyniku programu? tab[0] zawiera znak o kodzie ASCII 2 ( http://pl.wikipedia.org/wiki/ASCII). Być może chciałeś wypisać znak o kodzie ASCII 50, czyli cyfrę 2.


(Tomo8813) #3

Generalnie program ma dodawać do siebie dwie tablice znaków np: char n1[] = "1946574832182"; oraz char n2[] = "132432311";. Tworzę więc tworze funkcję która przyjmuje i przetwarza obydwie tablice (czyli wysyłam jej adresy pierwszych ich elementów oraz ich rozmiary nie zbędnych do przetwarzania tablic w funkcji) oraz dodatkowo kolejna tablicę która zwrócę jako wynik funkcji . W pętli for odwołuję się do podanych wyżej dwóch tablic. Do zmiennej s zapisuje wynik sumy danych wartości tab przez indeks. Mniej więcej wygląda to tak s = ((tab_-'0') + (n1__-'0') + (n2__-'0')) - oczywiście przed dodaniem do siebie dwóch wartości uwzględniam możliwości przekroczenia wyniku poza zakres jedności, możliwości ze jedna z tablic jest krótsza od drugiej i takie tam. Wszystko działa bez zarzutu pozostaje mi tylko przypisać danemu elementowi wynikowej tablicy wartość obiektu s (który zawiera się w zbiorze liczb {1, .. ,9} ) no i właśnie tu pojawia się mój problem ........ Niby proste ale zatrzymałem się właśnie w tym momencie i dalej ani rusz._


([alex]) #4
char *a=n1+strlen(n1)-1,*b=n2+strlen(n2)-1;int p=0; // przenoszeniewhile((a=n1)(b=n2))  {   p+=(*(a--)-'0')+(*(b--)-'0');   char c=p%10+'0';   p/=10;   coutc;  }a=n1)  {   p+=(*(a--)-'0');   char c=p%10+'0';   p/=10;   coutc;  }b=n2)  {   p+=(*(b--)-'0');   char c=p%10+'0';   p/=10;   coutc;  }p)  {   char c=p%10+'0';   p/=10;   coutc;  }[/code]Wynik będzie w odwrotnej kolejności ale oczywiście możesz przerobić do zapisywania wyniku do tablicy.

Długość wyniku będzie od max(strlen(n1),strlen(n2)) do max(strlen(n1),strlen(n2))+1.

Po obliczeniu wyniku można pominąć zera z przodu.

(Juszczyk Pawel) #5

Do konwersji int na char* służy funkcja itoa. W takim przypadku musisz tylko uważać, żeby int czy się nie przekręcił.


(Hixohe) #6

Jednym ze sposobów jest odejmowanie 48 od wartości kodu znaku. Czyli pobierasz kolejne znaki zaczynając od ostatniego. Rzutujesz char na int'a dodajesz do siebie i odejmujesz 96 (2*48). Czyli coś w stylu

char liczba1 = '1';

char liczba2 = '7';

int suma = static_cast(liczba1)+static_cast(liczba2)-96;

Taka mała uwaga, że wartość którą należy odjąć może być inna niż 48 (choć zazwyczaj jest to właśnie 48). Bezpieczniej jest sprawdzić jaka jest różnica i dopiero później odejmować.