本に掲載されている 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言語のバイブルです。
英語版を読んでみたいですね。訳がよくわからない部分があるので。

- 作者: B.W.カーニハン,D.M.リッチー,石田晴久
- 出版社/メーカー: 共立出版
- 発売日: 1989/06/15
- メディア: 単行本
- 購入: 28人 クリック: 721回
- この商品を含むブログ (200件) を見る