atoi etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
atoi 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.


10 Ağustos 2017 Perşembe

atoi

Giriş
atoi - int'e çevirir. İmzası şöyle
int atoi(const char* c);
atoi artık kullanılmıyor. atoi altta kendisi de strtol()'u kullanır. Yani atoi altta şöyledir.
(int)strtol(token_start, (char **)NULL, 10);
atoi'nin sıkıntısı hatalı durumu bildirememesi. Exception atmadığı için hata kodu olarak 0 döndürüyorlar ki bu da aslında geçerli bir sayı da olabilir. Bu yüzden mümkünse bu metoddan uzak durmak lazım.

Örnek
Eğer kendi atoi metodumuzu yazsaydık şöyle  olurdu.
int atoi(const char *c)
{
  int value = 0;
  int sign = 1;
  if (*c == '+' || *c == '-')
  {
    if (*c == '-') sign = -1;
    c++;
  }
  while (isdigit(*c))
  {
    value *= 10;
    value += (int)(*c - '0');
    c++;
  }
  return value * sign;

}
Örnek
atoi benzer ancak bu sefer int128_t ile çalışan kod şöyle
__int128 atoint128_t(std::string const & in)
{
  __int128 res = 0;
  size_t i = 0;
  bool sign = false;

  if (in[i] == '-')
  {
    ++i;
    sign = true;
  }

  for (; i < in.size(); ++i)
  {
    const char c = in[i];
    if (not std::isdigit(c)) 
      throw std::runtime_error(std::string("Non-numeric character: ") + c)
    res *= 10;
    res += c - '0';
  }

  if (sign)
  {
    res *= -1;
  }

  return res;
}

int main()
{
  __int128 a = atoint128_t("170141183460469231731687303715884105727");
}