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
Post a Comment