Чтение строк (Из шестнадцатеричных в десятичные числа) - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, товарищи! Проблема! Писал программу , которая должна принимать из файла шестнадцатеричные цифры и переводить их в десятичные. Я написал следующий код, который по моему мнению должен был работать как швейцарские часы, хоть он и выглядит огромным для такой простой задачки.
#include <stdio.h>
#include <string.h>
 
int hex_to_d (char l){//функция переводящая символы в числа
    char num='0';
    switch (l){
        case '0':
            num = 0;
            break;
        case '1':
            num = 1;
            break;
        case '2':
            num = 2;
            break;
        case '3':
            num = 3;
            break;
        case '4':
            num = 4;
            break;
        case '5':
            num = 5;
            break;
        case '6':
            num = 6;
            break;
        case '7':
            num = 7;
            break;
        case '8':
            num = 8;
            break;
        case '9':
            num = 9;
            break;
        case 'a':
            num = 10;
            break;
        case 'b':
            num = 11;
            break;
        case 'c':
            num = 12;
            break;
        case 'd':
            num = 13;
            break;
        case 'e':
            num = 14;
            break;
        case 'f':
            num = 15;
            break;
        default:
            num = 0;
            break;
    }
    return num;
}
 
int main(int argc, const char * argv[])
{
    FILE *input = fopen(argv[1], "r");
    int temp=0, result=0, sl;
    char line[5];
    while (fgets(line, sizeof(line), input)!=NULL) {
        sl = (int)strlen(line); //определяем длину строки
        if(line[sl]=='\0'){ // если строка закончилась
            sl = sl - 1;       // длина строки уменьшается на 1
        }
        printf("line; %s num of symbols: %i\n", line, sl); // это чисто проверка и она даёт понимание об ошибке
 
        if(sl == 4){//если в строке четыре символа
            temp = hex_to_d(line[0]);// считаем тысячи
            temp = temp*4096;
            result += temp;
            temp = 0;
            temp = hex_to_d(line[1]);// считаем сотни
            temp = temp*256;
            result += temp;
            temp = 0;
            temp = hex_to_d(line[2]);// считаем десятки
            temp = temp*16;
            result += temp;
            temp = 0;
            temp = hex_to_d(line[3]);// считаем сотни
            result += temp;
            temp = 0;
            printf("%i\n", result);
            result = 0;
        }
        else if(sl == 3){//если в строке три символа
            temp = hex_to_d(line[0]);// считаем сотни
            temp = temp*256;
            result += temp;
            temp = 0;
            temp = hex_to_d(line[1]);// считаем десятки
            temp = temp*16;
            result += temp;
            temp = 0;
            temp = hex_to_d(line[2]);// считаем сотни
            result += temp;
            temp = 0;
            printf("decimal %i\n", result);
            result = 0;
        }
        else if(sl == 2){//если в строке два символа
            temp = hex_to_d(line[0]);// считаем десятки
            temp = temp*16;
            result += temp;
            temp = 0;
            temp = hex_to_d(line[1]);// считаем сотни
            result += temp;
            temp = 0;
            printf("decimal %i\n", result);
            result = 0;
        }
        else {//если в строке один символ
            temp = hex_to_d(line[0]);// считаем сотни
            result += temp;
            temp = 0;
            printf("decimal %i\n", result);
            result = 0;
        }
 
    }
    return 0;
}
Короче говоря, для эксперимента я ввёл из файла следующие числа: aaa 9a 9b И каков я получил результат? Первые числа считаются нормально:

line; aaa num of symbols: 3 decimal: 2730 line; 9a num of symbols: 2 decimal: 154

Но проблема возникла тут! И так во всех случаях с последней строкой!

line; 9b num of symbols: 1 decimal: 9

Я не могу понять, почему последний символ, который является символом, а не концом строки считается за конец строки????
И ещё вон какой выкрутас, когда я добавил число bbbb в самое начало:

line; bbbb num of symbols: 3 decimal: 3003 line; num of symbols: 0 decimal: 0 line; aaa num of symbols: 3 decimal: 2730 line; 9a num of symbols: 2 decimal: 154 line; 9b num of symbols: 1 decimal: 9

Решение задачи: «Чтение строк (Из шестнадцатеричных в десятичные числа)»

textual
Листинг программы
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
 
int main(int argc, char **argv)
{
    char str[10]="0xFFFF";
    printf("%s %d\n", str, strtol(str, NULL, 16));
    
    return EXIT_SUCCESS;
}

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

  1. Включаем необходимые заголовочные файлы
    • string.h - для функции strlen()
    • stdio.h - для функции printf()
    • stdlib.h - для функции strtol()
  2. Создаем основную функцию программы
    • main()
  3. Инициализируем переменную str
    • Тип данных: char
    • Объем памяти: 10 символов
    • Значение по умолчанию: 0xFFFF
  4. Выводим значение переменной str и результат преобразования
    • printf()
    • %s - спецификатор формата для вывода строки
    • %d - спецификатор формата для вывода целого числа
    • strtol() - функция для преобразования строки в целое число
    • str - аргумент функции strtol()
    • NULL - аргумент функции strtol()
    • 16 - аргумент функции strtol()
  5. Возвращаем успешный результат выполнения программы
    • EXIT_SUCCESS

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


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

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

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