diff options
author | zlg <zlg@zlg.space> | 2013-02-27 05:54:58 -0600 |
---|---|---|
committer | zlg <zlg@zlg.space> | 2013-02-27 05:54:58 -0600 |
commit | 8557e29d33b365816114996d04531468e13e78b1 (patch) | |
tree | 9206150286154c02bb804734151845001cd1767d /ch2 | |
parent | Shorten 2-01's code (diff) | |
download | knr-8557e29d33b365816114996d04531468e13e78b1.tar.gz knr-8557e29d33b365816114996d04531468e13e78b1.tar.bz2 knr-8557e29d33b365816114996d04531468e13e78b1.tar.xz knr-8557e29d33b365816114996d04531468e13e78b1.zip |
Solve Exercise 2-02: No logical operators
The text doesn't specify which technique to use. The section outlined
operator precedence, but I couldn't think of a way to check for truth in
the three main expressions without logical operators. So I turned to a
recursive function. It works, but I'm not sure if it's what K&R were
after.
Diffstat (limited to 'ch2')
-rw-r--r-- | ch2/2-02_no-logical-operators.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/ch2/2-02_no-logical-operators.c b/ch2/2-02_no-logical-operators.c new file mode 100644 index 0000000..6fea5d6 --- /dev/null +++ b/ch2/2-02_no-logical-operators.c @@ -0,0 +1,44 @@ +#include <stdio.h> + +/* The C Programming Language, 2nd Edition + * + * Exercise 2-2: Write a loop equivalent to the 'for' loop above without + * using && or ||. + * + * (The for loop is: + * + * for (i=0; i < lim - 1 && (c = getchar()) != '\n' && c != EOF) + * i++; + * + * Answer: A recursive function should do the job. I think... + * + */ + +#define LIMIT 17 + +char test[LIMIT] = ""; +int i = 0; +int c; + +void save_string(char s[]) { + if (i < LIMIT - 1) { + c = getchar(); + if (c != '\n') { + if (c != EOF) { + s[i] = c; + i++; + } else { + return; + } + } else { + return; + } + save_string(s); + } +} + +int main() { + save_string(test); + printf("%s\n", test); + return 0; +} |