プログラミング言語 C 3.4


本に掲載されている atoiでは INT_MINがうまく扱えないのでその理由と
その問題を修正したものを書けという問題。うまくいかない理由は符号の
処理を最後にしているから、INT_MINを求めるのに -(INT_MAX + 1)となって
しまって答えがおかしくなってしまう。なのでマイナスの数の場合はもともと
マイナスとして計算していけば大丈夫。

#include <stdio.h>
#include <limits.h>
#include <assert.h>

static int my_atoi(char *s);
static void my_atoi_test();

int main (void)
{
     my_atoi_test();
}

static void
my_atoi_test()
{
     assert(my_atoi("0") == 0);
     assert(my_atoi("1") == 1);
     assert(my_atoi("+1") == 1);
     assert(my_atoi("-1") == -1);
     assert(my_atoi("+987654") == 987654);
     assert(my_atoi("-987654") == -987654);
     assert(my_atoi("-987654") == -987654);
     assert(my_atoi("2147483647") == INT_MAX);
     assert(my_atoi("-2147483648") == INT_MIN);
}

static int
my_atoi (char *s)
{
     int i, n, sign;

     for (i = 0; isspace(s[i]); i++) {
          /* skip spaces */
     }

     sign = (s[i] == '-') ? -1 : 1;

     /* skip sign '+' or '-' */
     if (s[i] == '+' || s[i] == '-') {
          i++;
     }

     for (n = 0; isdigit(s[i]); i++) {
          if (sign == 1) {
               n = 10 * n + (s[i] - '0');
          }
          else {
               n = 10 * n - (s[i] - '0');
          }
     }

     return n;
}

そういえば本の紹介をしていなかった。C言語のバイブルです。
英語版を読んでみたいですね。訳がよくわからない部分があるので。

プログラミング言語C 第2版 ANSI規格準拠

プログラミング言語C 第2版 ANSI規格準拠