やっぱり昨日の16進数ルーチンはおかしい

昨日の16進数文字列を数値に変換するルーチンがおかしかったのでもう一回考えてみたところやっぱり間違えていたらしい。やっぱりプログラムの検証ってけっこう難しいのかな。まあ、K&Rくらいは全問正解したいのでがんばろう。

#include <stdio.h>
#include <string.h>
#include <ctype.h>

// 与えられる文字列の例: 0x01234567890abcdef, 0X0123456789ABCDEF
int htoi(char *s)
{
	int i= 0;
	int num = 0;
	int length = strlen(s);
	int c = 0;
	
	// 入力チェックしてないけど
	for (i = 2; i < length; i++) {
		c = s[i];
		if (isdigit(c)) {
			num = (c - '0') + num * 16;
		} else {
			num = (toupper(c) - 'A' + 10) + num * 16;
		}
	
	}
	return num;
}