В целом, это выглядит довольно хорошо.Я добавлю несколько комментариев для вещей, которые, я думаю, вы могли бы улучшить.
int hatoi(char c)
{
int res;
if (isdigit(c))
res = c - '0';
Нет реальной причины для создания переменной res
.Вы всегда возвращаете все, что вы установили в этой переменной, и никогда не меняете ее.Почему бы просто не заменить res = c - '0'
и более поздние return res
на return c - 0
?
else if (c >= 'a' && c <= 'f')
/* offset a..f to 10-14 */
res = (c - '0')-39;
Это кажется несколько запутанным.Почему вы вычитаете '0'
, а затем 39
?Было бы намного яснее сказать (c - 'a') + 10
.Кроме того, комментарий неправильный, он должен сказать 10-15
.
result = power = 0;
len = strlen(s)-1;
for (i=len; i >= 0; --i) {
Ваш цикл выполняется по всей строке;но в шестнадцатеричной строке, такой как 0xabcd
, 0x
, вероятно, не следует рассматривать как часть числа, которое вы анализируете.То, как вы это делаете, рассматривая неизвестные символы как 0, не должно иметь значения для вашей тестовой строки, но если вы начнете делать другие вещи в начале (например, 1230xabcd
), вы получите довольно странный результат.Я бы порекомендовал проверить, что первые два символа на самом деле 0x
(вероятно, возвращают 0
, если нет), а затем выполнить цикл до 2
, а не до 0
.
digit = hatoi(s[i]);
if (digit) {
Youкажется, увеличивается только power
, если цифра не равна нулю.Таким образом, для числа, подобного 0x0102
, вы получите 18 вместо правильного результата 258. Нет необходимости в проверке if (digit)
.Если вы хотите вернуть часового с hatoi
в случае недопустимых символов, чтобы проигнорировать их, я бы рекомендовал вернуть -1
, а затем установить if (digit >= 0)
.
if (power == 0) {
result += digit;
power++;
Если выинициализируйте power
в 1
вместо 0
, вам не понадобится этот особый случай.
} else
result += digit * power;
power *= 16;
}
}