Чтение строк (Из шестнадцатеричных в десятичные числа) - 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