char zamiana na ansii

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
mr_andre
-
Posty: 11
Rejestracja: 15 wrz 2007, 13:15
Lokalizacja: Z domu

char zamiana na ansii

Post autor: mr_andre » 24 lip 2008, 16:21

Witam, chcę sobie napisać funkcję która będzie mi zamieniała zmienne liczbowe typu char na znaki ansii, wiem jak zamienić dowolną liczbę na tablicę:

char tablica[] = "123456789";
ale nie wiem jak zamienić jakąś zmienną na tablicę, czy może mi ktoś w tym pomóc? Drugie pytanie jak od razu wiedzieć po zapisaniu do tablicy zmiennej ile ona ma elementów ;] Nie chcę używać bibliotek do obsługi tego, chcę jak najmniej obszerny kod mieć ;]

Pozdrawiam
Andrzej

Awatar użytkownika
Wesker
-
Posty: 27
Rejestracja: 01 lut 2006, 10:33
Lokalizacja: Leżajsk

Post autor: Wesker » 24 lip 2008, 16:30

by liczbę zamienić na asci wystarczy użyć dzielenia całkowitego i dodać '0'.

mr_andre
-
Posty: 11
Rejestracja: 15 wrz 2007, 13:15
Lokalizacja: Z domu

Post autor: mr_andre » 24 lip 2008, 16:44

---------------------------------------------------------------------------------------------

[ Dodano: 2008-07-25, 15:53 ]
Witam ponownie, może mi ktoś napisać jak użyć poniższej funkcji? Chodzi mi o to jakiego typu dane zadeklarować i jak uruchomić ja ;]

int a = '4849'
char *string_ptr;
const unsigned int divisor[4]={10000,1000,100,10};

void itoa(unsigned int value,char *string_ptr)
{
int i;

for(i=0;i<4;i++) // do that down to tenths
{
string_ptr='0'; // initial value is ASCII '0'
while(value>=divisor) // loop while current value >= divisor
{
value-=divisor; // decrement current value
string_ptr++; // and increment the char in result table
}
}
string_ptr[4]=(char)value+'0'; // last char equals the final value + '0'
}

a = itoa(a, *string_ptr);

Awatar użytkownika
Wesker
-
Posty: 27
Rejestracja: 01 lut 2006, 10:33
Lokalizacja: Leżajsk

Post autor: Wesker » 26 lip 2008, 17:14

Moim zdaniem powinno być tak:

Kod: Zaznacz cały

unsigned int a=4849;   //argumentem twojej funkcji jest liczba dodatnia bez znaku
char buffer[5];  //dla liczb do 99999 potrzeba 5 znaków
string_ptr= & buffer[0];   //wskaźnik trzeba zainicjować, może być też  string_ptr=buffer;
// ale od razu możesz przekazać do funkcji nazwę tablicy i nie używać char *string_ptr;

//twoja funkcja wypełnia tablice char poszczególnymi cyframi w kodzie asii ale nic nie //zwraca
//a = itoa(a, *string_ptr); jest błędem
itoa(a, *string_ptr);   //prawidłowe wywołanie
itoa(a, buffer);   //jeszcze lepiej

//pozostaje wyświetlić elementy tablicy
//nie wiem jaką masz funkcje do wyświetlania, ale może to być tak
signed char i;
for(i=4;i>=0;i--)
{
   wyswietl_cyfre(buffer[i]);   
}
niestandardowa funkcja itoa jest w stdlib więc weź pod uwagę użycie innej nazwy

alaris
Użytkownik
Posty: 530
Rejestracja: 21 lut 2006, 14:56
Lokalizacja: Gorzow/Poznan

Post autor: alaris » 26 lip 2008, 17:22

Sprobuj tego:

Kod: Zaznacz cały

char liczba = 123;
char wynik[3] = {0} ; //zerowanie

for(char i=0 ; i<3 ; i++){
    wynik[i] = liczba%10 ; //pobierz ostatnia cyfre
    liczba = liczba / 10 ; //usun ostatnia cyfre
}

Operacja % (modulo) zwraca reszte z dzielenia, czyli ostatnia cyfre w tym wypadku. Jezeli liczbe podzielisz przez dziesiec to "przesuwasz" ja o jedna pozycje i usuwasz odczytana wlasnie cyfre.
Petla for wykonuje sie trzy razy, bo masz do trzech cyfr, np. 123 daje Ci 1, 2, 3.

ODPOWIEDZ