Programowanie w języku C/C++

Strtol

  • 2014-03-30 09:09
  • 0 komentarzy
  • 3049 odsłon
  • Oceń ten tekst jako pierwszy
Liczby mogą być przechowywane w postaci łańcuchów lub w formie numeryczniej. Przechowywanie liczby jako łańcuch oznacza przechowywanie w tablicy poszczególne znaki liczby zakończone znakiem zerowym.

Jezyk C wymaga postaci numerycznej przy wykonywaniu operacji arytmetycznych, czy logicznych, ale wyświetlanie liczb na ekranie wymaga postaci łańcuchowej, ponieważ ekran wyświetla tylko znaki.  Funkcje typu printf za pośrednictwem symbolu %d i innych specyfikatorów zamieniają forme numeryczną w postać łańcuchową.

Istnieją także inne funkcje, których jedynym zadaniem jest przetwarzanie postaci łańcuchowej w postać numeryczną. Do takich funkcji należy funkcja strtol (string to long), która jest bardziej wyrafinowaną wersja funkcji atol.

#include <stdlib.h>
long int strtol(const char *nptr, char **endptr, int base);


Funkcja strtol przyjmuje trzy argumenty, pierwszym jest wskaźnik to łańcucha, który ma być przetworzony, drugi jest adresem wskaźnika, który otrzymuje adres znaku kończącego liczbę, a ostatni to podstawa systemu liczbowego, w którym zapisano liczbę.

Przykład:
#include <stdio.h>
#include <stdlib.h>
 
int main (int argc, char *argv[]) {
    long liczba;
    char *endptr;
 
    if (argc != 2) 
        return EXIT_FAILURE;
 
    liczba = strtol (argv[1], &endptr, 10);
 
    if (*endptr)
        printf ("Niepoprawnie wprowadzona liczba.\n");
    else
        printf ("Liczba wpisana poprawnie: %ld.\n", liczba);
 
    return EXIT_SUCCESS;
}


Teraz uruchamiając program z parametrem otrzymujemy:

$ przyklad 3
Liczba wpisana poprawnie: 3.
$ przyklad 2f
Niepoprawnie wprowadzona liczba.

Funkcja strtol obsługuje systemy liczbowe aż do podstawy równej 36, rozpoznając oprócz cyfr także litery od 'a' do 'z'.

Istneją także funkcje podobne jak strtoul, która zamienia łańcuch na liczbę typu unsigned int lub strtod, która zamienia łańcuch na liczbę typu double i obsługuje tylko podstawe dziesiętną.