Exercise 2-3 (htoi - Hex to decimal)

Chapter_2     Exercise_2-2     Random_number_generator otoi     Exercise_2-4







Exercise 2-3     K&R, p. 46


Exercise 2-3. Write the function htoi(s), which converts a string of hexadecimal digits (including an optional 0x or 0X) into its equivalent integer value. The allowable digits are 0 through 9, a through f, and A through F.




htoi.c         download


#include <stdio.h> // for printf(), scanf()

#define LENGTH 15 // max length of hex string (2 hex digits per byte)

int htoi(char hex[]); // hex (string) to decimal (integer)

int main()
{
char s[LENGTH];

printf("Enter a hex number [+-]?[0x]?[0-9a-f]+ or [+-]?[0X]?[0-9A-F]+\n");
scanf("%s", s);
printf("htoi(%s): %d\n", s, htoi(s));

return 0;
}

int htoi(char hex[]) // hex (string) to decimal (integer)
{
if (hex[0] == '\0') // empty string
{ // not a number
printf("\"%s\" is not a valid number\n", hex);
return 0; // return value does not signal error, should use an exception
}
// here hex[] is not empty
int i = 0, n = 0, sign = 1;
char temp;

if (hex[i] == '-') // negative number
{
sign = -1;
i++; // skip optional sign
}
else if (hex[i] == '+') // positive number
{
i++; // skip optional sign
}

if (hex[i] == '0')
{
i++;
if (hex[i] == '\0')
{
return n; // return 0; // valid hex number
}
if (hex[i] == 'x' || hex[i] == 'X')
{i++;} // skip optional 0x or 0X
}
else if (hex[i] == 'o' || hex[i] == 'O')
{
temp = hex[i];
i++;
if (hex[i] == 'x' || hex[i] == 'X')
{
printf("\"%s\" is not a valid hex number\n", hex);
hex[i-1] = '0';
printf("Did you mean \"%s\"?\n", hex);
hex[i-1] = temp;
printf("Note the difference between 'o' or 'O' and '0' (zero)\n");
return 0;
}
}

if (hex[i] == '\0')
{
printf("\"%s\" is not a valid hex number\n", hex);
return 0;
}

while (hex[i] != '\0')
{
if (hex[i] >= '0' && hex[i] <= '9')
{n = n*16 + (hex[i]-'0');}
else if (hex[i] >= 'a' && hex[i] <= 'f')
{n = n*16 + (hex[i]-'a'+10);}
else if (hex[i] >= 'A' && hex[i] <= 'F')
{n = n*16 + (hex[i]-'A'+10);}
else // not a hex number
{
printf("\"%s\" is not a valid hex number\n", hex);
return sign * n;
}

i++;
}

return sign * n;
}
/*
gcc htoi.c -o htoi
./htoi
Enter a hex number [+-]?[0x]?[0-9a-f]+ or [+-]?[0X]?[0-9A-F]+
0
htoi(0): 0

./htoi
Enter a hex number [+-]?[0x]?[0-9a-f]+ or [+-]?[0X]?[0-9A-F]+
0x
"0x" is not a valid hex number
htoi(0x): 0

./htoi
Enter a hex number [+-]?[0x]?[0-9a-f]+ or [+-]?[0X]?[0-9A-F]+
1.2
"1.2" is not a valid hex number
htoi(1.2): 1

./htoi
Enter a hex number [+-]?[0x]?[0-9a-f]+ or [+-]?[0X]?[0-9A-F]+
-2.5
"-2.5" is not a valid hex number
htoi(-2.5): -2

./htoi
Enter a hex number [+-]?[0x]?[0-9a-f]+ or [+-]?[0X]?[0-9A-F]+
10
htoi(10): 16

./htoi
Enter a hex number [+-]?[0x]?[0-9a-f]+ or [+-]?[0X]?[0-9A-F]+
0x9
htoi(0x9): 9

./htoi
Enter a hex number [+-]?[0x]?[0-9a-f]+ or [+-]?[0X]?[0-9A-F]+
g
"g" is not a valid hex number
htoi(g): 0

./htoi
Enter a hex number [+-]?[0x]?[0-9a-f]+ or [+-]?[0X]?[0-9A-F]+
-25
htoi(-25): -37

./htoi
Enter a hex number [+-]?[0x]?[0-9a-f]+ or [+-]?[0X]?[0-9A-F]+
0x-10 // write -0x10
"0x-10" is not a valid hex number
htoi(0x-10): 0

./htoi
Enter a hex number [+-]?[0x]?[0-9a-f]+ or [+-]?[0X]?[0-9A-F]+
-0x10
htoi(-0x10): -16

./htoi
Enter a hex number [+-]?[0x]?[0-9a-f]+ or [+-]?[0X]?[0-9A-F]+
+025
htoi(+025): 37

./htoi
Enter a hex number [+-]?[0x]?[0-9a-f]+ or [+-]?[0X]?[0-9A-F]+
oxc // letter 'o' instead of digit '0'
"oxc" is not a valid hex number
Did you mean "0xc"?
Note the difference between 'o' or 'O' and '0' (zero)
htoi(oxc): 0

./htoi
Enter a hex number [+-]?[0x]?[0-9a-f]+ or [+-]?[0X]?[0-9A-F]+
0xc
htoi(0xc): 12

./htoi
Enter a hex number [+-]?[0x]?[0-9a-f]+ or [+-]?[0X]?[0-9A-F]+
+Ox14
"+Ox14" is not a valid hex number
Did you mean "+0x14"?
Note the difference between 'o' or 'O' and '0' (zero)
htoi(+Ox14): 0

./htoi
Enter a hex number [+-]?[0x]?[0-9a-f]+ or [+-]?[0X]?[0-9A-F]+
+0x14
htoi(+0x14): 20

./htoi
Enter a hex number [+-]?[0x]?[0-9a-f]+ or [+-]?[0X]?[0-9A-F]+
0xa1
htoi(0xa1): 161

./htoi
Enter a hex number [+-]?[0x]?[0-9a-f]+ or [+-]?[0X]?[0-9A-F]+
0xaA
htoi(0xaA): 170

/htoi
Enter a hex number [+-]?[0x]?[0-9a-f]+ or [+-]?[0X]?[0-9A-F]+
0Xaa
htoi(0Xaa): 170

./htoi
Enter a hex number [+-]?[0x]?[0-9a-f]+ or [+-]?[0X]?[0-9A-F]+
aA
htoi(aA): 170

./htoi
Enter a hex number [+-]?[0x]?[0-9a-f]+ or [+-]?[0X]?[0-9A-F]+
-AA
htoi(-AA): -170
*/





Note:  We specify 0x followed by lowercase letters a-f or 0X followed by uppercase letters A-F, but we allow any combination. See regular_expression on Wikipedia.









Chapter_2     Exercise_2-2     Rand BACK_TO_TOP otoi     Exercise_2-4



Comments

Popular posts from this blog

Contents

Blogger Page Margins in Contempo