strtol etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
strtol etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

15 Ağustos 2017 Salı

String'i Integer'a Çevirme - C

atoi - int'e çevirir
atoi yazısına taşıdım.

strtol - long'a çevirir
strtol yazısına taşıdım.

strtoul - unsigned long'a çevirir
strtoul() 10'luk düzen ile şöyle kullanılabilir
char * stop;
unsigned long int time = strtoul(argv[1], &stop, 10);
if (*stop != 0) {
    // strtoul failed to parse the argument.
}
16'lık düzen kullanılabilir.
const char* idString = ...
char *str_end = NULL,
var   id = strtoul(idString, &str_end, 16);
Düzen olarak 0 verilebilir. Bu durumda strtoul düzen'in ne olduğunu kendisi anlamaya çalışır.
int base = 0;
long n = strtol(idString, &str_end, base);
Hata kontrolü şöyle yapılır
if(*str == '\0') {
    /* str was empty */ (1)
} else if(endptr == str) {
    /* str was completely invalid */ (2)
} else if(*endptr != '\0') {
    /* numeric result followed by trailing nonnumeric character(s) */ (3)
} else {
    /* str was a completely valid number (perhaps with leading whitespace) */ (4)
}
3 durum. Eğer tüm string'in kullanılmasını beklemiyorsak - örneğin 0XFF_FF_FF_FF_FF verilmiştir - bu durumda errno'ya bakarız. Önce errno 0 yapılır.
errno = 0;
var id = strtol( idString, &str_end, 16 );
Taşma olduğunu böyle tespit ederiz.
if ( (id == ULONG_MAX) && (errno == ERANGE))
{...}
4. durum Eğer tüm string'in kullanılmasını istiyorsak stop'un null olduğuna bakmamız gerekir.

strtoul - long long'a çevirir
strtoll() 64 bitlik integer'a çevirir.


1 Ağustos 2017 Salı

strtol metodu

Giriş
Şu satırı dahil ederiz.
#include <cstdlib>
Sonucu long olarak istiyorsak kullanırız. Sonucu long long yani int64_t olarak istiyorsak strtoll () metodunu kullanmak gerekir.

İmzası
Metodun imzası şöyle.
long strtol(const char *str, char **endptr, int base);
Örnek
Şöyle yaparız.
char str[] = "987654321012345";
long num = 0;
errno = 0;

num = strtol (str, NULL, 10);
if (errno) {    /* validate strtol conversion */
  perror ("strtol conversion failed.");
  ...
}
printf ("%ld\n", num);
endptr kullanımı
Arka arkaya iki defa kullanmak istersek şöyle yaparız.
int sum(const char *input){
  int i; // store sum in here
  char *rest; // used as second argument in strtol
  i = strtol(input, &rest, 10); // set first int in string to i
  i += strtol(rest, &rest, 10); // add first and second int
  return i;
}

int main(void){
  char* nums = "23 42";
  printf("%d\n",sum(nums)); 
   return 0;
}
base kullanımı
16'lık taban kullanılabilir.
const char* idString = ...
char *str_end = NULL,
var   id = strtoul(idString, &str_end, 16);
Taban olarak 0 verilebilir. Bu durumda strtol tabanın ne olduğunu kendisi anlamaya çalışır.
int base = 0;
long n = strtol(idString, &str_end, base);