I\'m learning C and I can\'t figure out one of the K&R exercises, the listing:
Exercise 2-3, Write the function
htoi(s)
, which conv
Yesterday I wrote a function like this. You can see my code below.
/* Converting a hex string to integer, assuming the heading
0x or 0X has already been removed and pch is not NULL */
int hex_str_to_int(const char* pch) {
int value = 0;
int digit = 0;
for (; *pch; ++pch) {
if (*pch >= '0' && *pch <= '9') {
digit = (*pch - '0');
} else if (*pch >= 'A' && *pch <= 'F') {
digit = (*pch - 'A' + 10);
} else if (*pch >= 'a' && *pch <= 'f') {
digit = (*pch - 'a' + 10);
} else {
break;
}
// Check for integer overflow
if ((value *= 16) < 0 || (value += digit) < 0) {
return INT_MAX;
}
}
return value;
}
Here is the testing code:
int main(void) {
printf("%d %d\n", hex_str_to_int("0"), 0x0);
printf("%d %d\n", hex_str_to_int("A"), 0xA);
printf("%d %d\n", hex_str_to_int("10"), 0x10);
printf("%d %d\n", hex_str_to_int("A1"), 0xA1);
printf("%d %d\n", hex_str_to_int("AB"), 0xAB);
printf("%d %d\n", hex_str_to_int("100"), 0x100);
printf("%d %d\n", hex_str_to_int("1A2"), 0x1A2);
printf("%d %d\n", hex_str_to_int("10A"), 0x10A);
printf("%d %d\n", hex_str_to_int("7FFFFFF"), 0x7FFFFFF);
printf("%d %d\n", hex_str_to_int("7FFFFFF1"), 0x7FFFFFF1);
printf("%d %d\n", hex_str_to_int("7FFFFFF2"), 0x7FFFFFF2);
printf("%d %d\n", hex_str_to_int("7FFFFFFE"), 0x7FFFFFFE);
printf("%d %d\n", hex_str_to_int("7FFFFFFF"), 0x7FFFFFFF);
printf("%d %d\n", hex_str_to_int("80000000"), 0x7FFFFFFF + 1);
printf("%d %d\n", hex_str_to_int("80000001"), 0x7FFFFFFF + 2);
printf("%d %d\n", hex_str_to_int("10AX"), 0x10A);
printf("%d %d\n", hex_str_to_int("203!"), 0x203);
return 0;
}
It outputs the following values:
0 0
10 10
16 16
161 161
171 171
256 256
418 418
266 266
134217727 134217727
2147483633 2147483633
2147483634 2147483634
2147483646 2147483646
2147483647 2147483647
2147483647 -2147483648
2147483647 -2147483647
266 266
515 515