C++ Konwersja typu int na char

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.

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.

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._

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.

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

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ć.