Чтение строк (Из шестнадцатеричных в десятичные числа) - C (СИ)
Формулировка задачи:
Здравствуйте, товарищи!
Проблема! Писал программу , которая должна принимать из файла шестнадцатеричные цифры и переводить их в десятичные. Я написал следующий код, который по моему мнению должен был работать как швейцарские часы, хоть он и выглядит огромным для такой простой задачки.
Короче говоря, для эксперимента я ввёл из файла следующие числа:
aaa
9a
9b
И каков я получил результат? Первые числа считаются нормально:
#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; }
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; }
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы
- string.h - для функции strlen()
- stdio.h - для функции printf()
- stdlib.h - для функции strtol()
- Создаем основную функцию программы
- main()
- Инициализируем переменную str
- Тип данных: char
- Объем памяти: 10 символов
- Значение по умолчанию:
0xFFFF
- Выводим значение переменной str и результат преобразования
- printf()
- %s - спецификатор формата для вывода строки
- %d - спецификатор формата для вывода целого числа
- strtol() - функция для преобразования строки в целое число
- str - аргумент функции strtol()
- NULL - аргумент функции strtol()
- 16 - аргумент функции strtol()
- Возвращаем успешный результат выполнения программы
- EXIT_SUCCESS
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д