Есть несколько проблем с кодом.
Для начала функция scanf_s
должна включать в качестве параметра размер буфера для спецификатора формата c
.
Для вывода объекта типа unsigned long
необходимо использовать спецификатор формата ul
.
В этих операторах if вы не проверяете верхний предел действительных буквенно-шестнадцатеричных цифр.
if (currentDigit >= 'a') {
currentDigitInt = (currentDigit - 'a') + 10;
}
else if (currentDigit >= 'A') {
currentDigitInt = (currentDigit - 'A') + 10;
}
Чтобы проверить, является ли введенный символ действительной шестнадцатеричной цифрой, вы должны написать отдельную функцию.
Вот демонстрационная программа, которая показывает, как это можно сделать.
//Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23506 for x64
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int hex_digit( char c )
{
const char *alpha = "ABCDEF";
unsigned char c1 = toupper( ( unsigned char )c );
const char *p;
int result = -1;
if ( '0' <= c1 && c1 <= '9' )
{
result = c1 - '0';
}
else if ( c1 != '\0' && ( p = strchr( alpha, c1 ) ) != NULL )
{
result = *p - alpha[0] + 10;
}
return result;
}
int main(void)
{
const unsigned long HEX_BASE = 16;
unsigned int n;
printf( "Enter the number of digits in the Hexadecimal number: " );
scanf_s("%u", &n);
unsigned long sum = 0;
if ( n )
{
printf( "Enter the Hexadecimal number: " );
unsigned int i = 0;
for ( ; i < n; i++ )
{
char c;
scanf_s( " %c", &c, 1 );
int digit = hex_digit( c );
if ( digit < 0 ) break;
else sum = sum * HEX_BASE + digit;
}
if ( i == n )
{
printf("The decimal number is: %ul\n", sum);
}
else
{
puts( "Illegal input" );
}
}
return 0;
}
Его вывод может выглядеть следующим образом
Enter the number of digits in the Hexadecimal number: 8
Enter the Hexadecimal number: ffFFffFF
The decimal number is: 4294967295l
Если вы хотите, вы можете добавить в программу проверку, что указанное число введенных шестнадцатеричных цифр не превышает 2 * sizeof( unsigned long )
.