Фунция htoi. 2.3 (Преобразование hex строки в число) - C (СИ)
Формулировка задачи:
Выкладываем свои решение по задачи 2.3, преоброзование hex строки в число. Моё решение:
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
int htoi(char s[]);
main()
{
char test[12]="0xd978c9";
printf("%s\n",test);
printf("%x\n",htoi(test));
printf("%d\n",htoi(test));
getch();
}
htoi(char s[])
{
int i,n;
n=0;
if(s[1] == 'x')
for(i=2;isdigit(s[i]) || tolower(s[i]) >= 'a' && tolower(s[i]) <= 'f';i++)
{
if(isdigit(s[i]))
n=n*16+(s[i]-'0');
else
n=n*16+(10+tolower(s[i])-'a');
}
else
for(i=0;isdigit(s[i]) || tolower(s[i]) >= 'a' && tolower(s[i]) <= 'f';i++)
{
if(isdigit(s[i]))
n=n*16+(s[i]-'0');
else
n=n*16+(10+tolower(s[i])-'a');
}
return n;
}Решение задачи: «Фунция htoi. 2.3 (Преобразование hex строки в число)»
textual
Листинг программы
#include <stdio.h>
#include <errno.h>
size_t hex_to_num(const char* s){
char c;
size_t n = 0, i = 0;
errno = 0;
if(*s != '0')
goto err;
c = *(++s) & 0xDF;
if(c != 'X')
goto err;
if(! *(++s))
goto err;
for(; *s; ++s, i += 4){
if(*s >= '0' && *s <= '9')
n = (n << 4) | (size_t)(*s - '0');
else {
c = *s & 0xDF;
if(c >= 'A' && c <= 'F')
n = (n << 4) | (size_t)(c - 'A' + 10);
else
goto err;
}
}
//проверим на переполнение
if(i > (sizeof(size_t) << 3))
errno = ERANGE;
return n;
err:
errno = EINVAL;
return 0;
}
int main(void){
size_t a, b;
a = 0x12345678;
b = hex_to_num("0x12345678");
printf("%u\n%u\n\n", a, b);
a = 0xff00FFAA;
b = hex_to_num("0xff00FFAA");
printf("%u\n%u\n\n", a, b);
a = 0XABCDEF00;
b = hex_to_num("0XABCDEF00");
printf("%u\n%u\n\n", a, b);
return 0;
}
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы для работы с printf и errno.
- Определяем функцию hex_to_num, которая принимает на вход строку в формате шестнадцатеричной системы счисления и возвращает число в формате size_t.
- В функции hex_to_num инициализируем переменные: n — результат преобразования, i — счётчик количества обработанных символов.
- Устанавливаем начальное значение errno = 0;
- Проверяем, что первый символ не равен нулю. Если это так, то возвращаем ошибку.
- Принимаем второй символ и проверяем, что он равен 'X'. Если это не так, то возвращаем ошибку.
- Проверяем, что третий символ не равен нулю. Если это так, то возвращаем ошибку.
- Запускаем цикл по всем символам входной строки.
- Если текущий символ больше или равен '0' и меньше или равно '9', то добавляем его значение к результату.
- Если текущий символ больше или равен 'A' и меньше или равно 'F', то добавляем его значение к результату.
- Если текущий символ не соответствует ни одному из вышеописанных условий, то возвращаем ошибку.
- Проверяем, что результат не превышает максимально допустимое значение для типа size_t.
- Если результат проверки положительный, то устанавливаем errno = ERANGE;
- Возвращаем результат.
- Если во время выполнения функции произошла ошибка, то устанавливаем errno = EINVAL;
- Возвращаем 0.
- В функции main создаём три переменные типа size_t: a, b и c.
- Присваиваем им значения 0x12345678, 0xff00FFAA и 0XABCDEF00 соответственно.
- Вызываем функцию hex_to_num с соответствующими аргументами и выводим результат на экран.
- Завершаем работу программы.