Фунция 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;
}

Объяснение кода листинга программы

  1. Включаем необходимые заголовочные файлы для работы с printf и errno.
  2. Определяем функцию hex_to_num, которая принимает на вход строку в формате шестнадцатеричной системы счисления и возвращает число в формате size_t.
  3. В функции hex_to_num инициализируем переменные: n — результат преобразования, i — счётчик количества обработанных символов.
  4. Устанавливаем начальное значение errno = 0;
  5. Проверяем, что первый символ не равен нулю. Если это так, то возвращаем ошибку.
  6. Принимаем второй символ и проверяем, что он равен 'X'. Если это не так, то возвращаем ошибку.
  7. Проверяем, что третий символ не равен нулю. Если это так, то возвращаем ошибку.
  8. Запускаем цикл по всем символам входной строки.
  9. Если текущий символ больше или равен '0' и меньше или равно '9', то добавляем его значение к результату.
  10. Если текущий символ больше или равен 'A' и меньше или равно 'F', то добавляем его значение к результату.
  11. Если текущий символ не соответствует ни одному из вышеописанных условий, то возвращаем ошибку.
  12. Проверяем, что результат не превышает максимально допустимое значение для типа size_t.
  13. Если результат проверки положительный, то устанавливаем errno = ERANGE;
  14. Возвращаем результат.
  15. Если во время выполнения функции произошла ошибка, то устанавливаем errno = EINVAL;
  16. Возвращаем 0.
  17. В функции main создаём три переменные типа size_t: a, b и c.
  18. Присваиваем им значения 0x12345678, 0xff00FFAA и 0XABCDEF00 соответственно.
  19. Вызываем функцию hex_to_num с соответствующими аргументами и выводим результат на экран.
  20. Завершаем работу программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.4 из 5
Похожие ответы