aboutsummaryrefslogtreecommitdiff
path: root/ch2
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--ch2/2-03_hex-to-int.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/ch2/2-03_hex-to-int.c b/ch2/2-03_hex-to-int.c
new file mode 100644
index 0000000..566bd75
--- /dev/null
+++ b/ch2/2-03_hex-to-int.c
@@ -0,0 +1,48 @@
+#include <stdio.h>
+#include <ctype.h>
+
+/* The C Programming Language, 2nd Edition
+ *
+ * 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.
+ *
+ * Answer: ctype.h has some cool functions in it. Using just two functions from
+ * that header, my function's length is much shorter than it would be if I
+ * were to wing it alone with C primitives.
+ *
+ * Anyway, the idea is to make sure you're working with a hex digit,
+ * homogenize the case of the letters, and ignore x's. Since hex is base-16
+ * instead of base-10, plug a 16 in and perform some clever math based on
+ * ASCII knowledge.
+ *
+ * Since the function can be objectively proven correct, I included test cases
+ * to ensure that its output is correct.
+ *
+ * `man ascii` for more info, if you're using an OS that's actually useful.
+ */
+
+int htoi(char s[]) {
+ int i, val;
+
+ for (i = val = 0; isxdigit(s[i]) || toupper(s[i]) == 'X'; ++i) {
+ if (toupper(s[i]) == 'X') {
+ continue;
+ }
+ if (s[i] > '9') {
+ val = 16 * val + (toupper(s[i]) - '7');
+ // The 7 is because 'A' is 7 higher than '9' in ASCII and thus only needs
+ // to be knocked down by that much to fall in line with the normal integer
+ // conversion
+ } else {
+ val = 16 * val + (s[i] - '0');
+ }
+ }
+ return val;
+}
+
+int main() {
+ printf(" HEX | DECIMAL\n---------------\n 1 = %3d\n 0xf = %3d\n0X64 = %3d\n fF = %3d\n 093 = %3d\n", htoi("1"), htoi("0xf"), htoi("0X64"), htoi("fF"), htoi("093"));
+ return 0;
+}
2cd22d41aa6f5f85a6b451386422fb4a&follow=1'>Branch off from master with pytest, tox, clickzlg16-778/+779 2018-03-18Flesh out filter types and ownership statuszlg3-82/+144 2018-03-18README.mdown: break line correctlyzlg1-1/+1 2018-03-18add 'playlog' list filterzlg2-2/+9 2018-03-13Update helpers a bitzlg1-2/+9 2018-03-13Make VGSTASH_DB_LOCATION point to a filezlg2-21/+20 2016-11-18Remove settings from helpers.shZe Libertine Gamer1-5/+0 2016-11-15Correct phrasing in README.Ze Libertine Gamer1-4/+4 2016-11-13DerpZe Libertine Gamer1-0/+1 2016-11-03Improve error handling in shell scriptsZe Libertine Gamer4-3/+23 2016-10-24Correct run_again, add recursionZe Libertine Gamer1-0/+4 2016-10-21Add quotes to correct behavior for arglistZe Libertine Gamer1-1/+1 2016-10-14updater.sh: add recursion, error handlingZe Libertine Gamer1-43/+101 2016-10-14Correct pipe-handling behaviorZe Libertine Gamer1-1/+9 2016-10-12Clarify a method to move between platformsZe Libertine Gamer1-2/+5