見出し画像

C言語-#8.atoi,atof

はおっ。

数値への変換です。Integer版と float版があります。

atoi
atof


atoi

int atoi(const char *s)
{
  int sign = 0;
  int ret = 0;

  while (*s == ' ') {
    s++;
  }  // 先頭の空白を飛ばす

  // 符号チェック
  switch (*s) {
  case '-':
    sign = -1;
  // fall through
  case '+':
    s++;
    break;
  }

  while (*s >= '0' && *s <= '9') {
    ret = ret * 10 + *s - '0';
    s++;
  }

  return (sign != 0) ? -ret : ret;
}

atof

double atof(const char *s)
{
  int sign = 0;
  double ret = 0;
  double decimal = 1;

  while (*s == ' ') {
    s++;
  }  // 先頭の空白を飛ばす

  // 符号チェック
  switch (*s) {
  case '-':
    sign = -1;
  // fall through
  case '+':
    s++;
    break;
  }

  // 整数部
  while (*s >= '0' && *s <= '9') {
    ret = ret * 10 + *s - '0';
    s++;
  }
  // 小数点
  if (*s == '.') {
    s++;
  }
  //小数部
  while (*s >= '0' && *s <= '9') {
    ret = ret * 10 + *s - '0';
    decimal *= 0.1;
    s++;
  }

  return ((sign != 0) ? -ret : ret) * decimal;
}

おわり

標準ライブラリでどうやってるかは分からないけど、都合のいいように書いちゃってます。たぶん不足していることは多々あると思われ(空白飛ばしとか)。それでも遜色ない挙動なので知らないよりは知っていた方がいいよってくらいかな。

悉く書を信ずれば則ち書無きに如かず