aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzlg <zlg@zlg.space>2017-02-27 01:20:38 -0800
committerzlg <zlg@zlg.space>2017-02-27 01:20:38 -0800
commitfcfb2db63b01f209fb2c8fdc500023241435377f (patch)
tree14ba7ef578cedc78995985921742f5de6fe9c428
parentSolve Exercise 7-8: Paged file print-outs (diff)
downloadknr-fcfb2db63b01f209fb2c8fdc500023241435377f.tar.gz
knr-fcfb2db63b01f209fb2c8fdc500023241435377f.tar.bz2
knr-fcfb2db63b01f209fb2c8fdc500023241435377f.tar.xz
knr-fcfb2db63b01f209fb2c8fdc500023241435377f.zip
Solve Exercise 7-9: isupper, time, and space
-rw-r--r--ch7/7-09_isupper-time-space.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/ch7/7-09_isupper-time-space.c b/ch7/7-09_isupper-time-space.c
new file mode 100644
index 0000000..bc96551
--- /dev/null
+++ b/ch7/7-09_isupper-time-space.c
@@ -0,0 +1,32 @@
+#include <stdio.h>
+#include <string.h> /* strchr */
+
+/* The C Programming Language: 2nd Edition
+ *
+ * Exercise 7-9: Functions like `isupper` can be implemented to save space
+ * or to save time. Explore both possibilities.
+ *
+ * Notes: I'm not really sure what they're expecting here. Assuming standard
+ * ASCII, the only uppercase characters are A-Z, and they're all sequential.
+ * Both ways to check seem very lean on necessary resources; I'm unaware of
+ * other methods.
+ */
+
+int isupper_small(int c) {
+ return (c >= 'A' && c <= 'Z');
+}
+
+int isupper_fast(int c) {
+ return (strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZ", c) != NULL);
+}
+
+int main(int argc, char **argv) {
+ int c = 'S';
+ /* The inline conditional makes things more "human-friendly". */
+ printf("is '%c' uppercase? %c\n", c, isupper_fast(c) ? 'y' : 'n');
+ c = 'f';
+ printf("...what about '%c'? %c\n", c, isupper_small(c) ? 'y' : 'n');
+ c = ':';
+ printf("Does a colon have an uppercase variant? %c\n", isupper_small(c) ? 'y' : 'n');
+ return 0;
+}