本に掲載されている 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件) を見る