poniedziałek, 14 grudnia 2015

C - Zmiana wartości całkowitej na znakową

W tym poście opiszę w jaki sposób dokonać zmiany z postaci liczbowej całkowitej do postaci znakowej.

Aby dokonać takiej konwersji najlepiej wykorzystać funckję itoa.


Poniżej przedstawiłem kod podanej funkcji wraz z komentarzem.

char* itoa(int value, char* buffer, int base)
{
    //tablica znaków
    static const char digits[]="0123456789abcdef";
 
    //Zmienne
    char* buffer_copy=buffer;
    int32_t sign=0;
    int32_t quot,rem;
 
        //Jeśli podstawa jest większa lub równa 2 oraz mniejsza lub równa 16
        //wtedy wykonaj funkcję
 if ((base>=2)&&(base<=16))
 {
     //Jeśli wartosc podstawy 10, oraz zmienna ze znakiem minus,
     //wtedy dokonaj zamiany na wartość dodatnią.
     if (base == 10 && (sign = value) < 0)
     value = -value;  
  do
  {
       //Obliczenie zmiennej quot poprzez podzielenie wartości przez jej bazę
              quot=value/base;
 
       //Podzielenie wartości przez bazę, zwracana wartość bez reszty 
       rem=value%base;
 
       //Przypisanie wartości zmiennej do wartości char
       *buffer++ = digits[rem];
 
              //pętla wykonywana do momentu aż jest co dzielić, kończy 
                     //działąnie kiedy
                     value = wartości quot
 
  } while ((value=quot));
 
                //Sprawdzenie czy wartość była negatywna
  if (sign<0)
                        //Jeśli tak to przypisanie znaku
   *buffer++='-';
 
                //Wykorzystanie funkcji reverse do odwrócenia wartości na string
  __reverse(buffer_copy,buffer-1);
 
        //Dodanie znaku na końcu linii 
 *buffer='\0';
 //zwrócenie wartości w formacie string
 return buffer_copy;
}

Jako jej argumenty należy podać odpowiednio wartość jaka ma ulec konwersji, wskaźnik do zmiennej znakowej w której zostanie przechowywana zamieniona wartość oraz podstawę wartości konwertowanej. W tym przypadku do wyboru jest system dwójkowy, dziesiętny oraz szesnastkowy.

Druga funkcja wykorzystywana przez itoa pozwala na odwrócenie kolejności w zapisie danych. Przez co otrzymuje się na wyjściu zmienną znakową w kolejności początkowej:

static void __reverse(char* begin,char* end)
{
 char temp;
 
 while (end>begin)
 {
  temp=*end;
  *end--=*begin;
  *begin++=temp;
 }
}