1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
|
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int getDigitValue(char digit, int base)
{
int digit_value;
switch(digit)
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
digit_value = digit - '0';
break;
case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f':
digit_value = digit - 'a' + 10;
break;
case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':
digit_value = digit - 'A' + 10;
break;
default:
digit_value = -1; /* Error not numerical digit */
break;
}
if(digit_value >= base)
digit_value = -1; /* Error digit out of range */
return digit_value;
}
int getIntFromBase(char* text, int base)
{
int index = 0;
int value = 0;
int negative = 0;
char digit;
int digit_value;
if (text[0] == '\0')
return value; /* error empty string */
if (text[0] == '-')
{
negative = 1;
index = 1;
}
else
if (text[0] == '+')
{
index = 1;
}
while(index != 31)
{
digit = text[index++];
if(digit == '\0')
break;
digit_value = getDigitValue(digit, base);
if(digit_value < 0)
break; /* error, bad input character */
value = value * base + digit_value;
}
if(negative != 0)
value = (value ^ 0xffffffff) + 1;
return value;
}
int main(void)
{
printf("%i\n", getIntFromBase("-123", 16));
assert(getDigitValue('8', 8) == -1);
assert(getDigitValue('8', 9) == 8);
assert(getIntFromBase("fF", 16) == 255);
assert(getIntFromBase("+fF", 16) == 255);
assert(getIntFromBase("-fF", 16) == -255);
assert(getIntFromBase("777", 8) == 511);
printf("A L L T E S T S P A S S E D !\n");
return 0;
} |
Partager