Фунция 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 с соответствующими аргументами и выводим результат на экран.
- Завершаем работу программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д