diff options
author | martin@ashbysoft.com <martin@ashbysoft.com> | 2022-06-11 21:25:01 +0000 |
---|---|---|
committer | martin@ashbysoft.com <martin@ashbysoft.com> | 2022-06-11 21:25:01 +0000 |
commit | 83e0861e200999ed46a1a1a8afa0b5638e48e14b (patch) | |
tree | 05cf8909e5c53c2b540f2b7aa71d0f12769001e9 /ex1-10.c | |
parent | 62482c2d0d6b2080d51fe6ea03e2ccd93e3351e0 (diff) | |
download | learn-c-83e0861e200999ed46a1a1a8afa0b5638e48e14b.tar.gz learn-c-83e0861e200999ed46a1a1a8afa0b5638e48e14b.tar.bz2 learn-c-83e0861e200999ed46a1a1a8afa0b5638e48e14b.tar.xz learn-c-83e0861e200999ed46a1a1a8afa0b5638e48e14b.zip |
ex1-9 ex1-10
Diffstat (limited to 'ex1-10.c')
-rw-r--r-- | ex1-10.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/ex1-10.c b/ex1-10.c new file mode 100644 index 0000000..0b0c018 --- /dev/null +++ b/ex1-10.c @@ -0,0 +1,36 @@ +#include <stdio.h> +#include <stdint.h> +#include <stdbool.h> + +/* Track whether we are inside or outside a word */ +typedef enum _state {IN,OUT} state; + +/* true if c is a 'word' character (not a blank, space, or a tab) */ +bool is_word(char c) { + return c != ' ' && c != '\t' && c != '\n'; +} + +/* Counts characters, lines, and words from stdin. + + 'characters' are single byte characters. No handling for encodings in c standard lib. + 'lines' are newline characters. + 'words' are contiguous sequences of characters other than space, tab, newline */ +int main(void) { + int c; + state s = OUT; + uint32_t cc = 0, lc = 0, wc = 0; + while ((c = getchar()) != EOF) { + cc++; + if (c == '\n') { + lc++; + } + if (!is_word(c)) { + s = OUT; + } else if (s == OUT) { + s = IN; + wc++; + } + } + printf("cc=%d lc=%d wc=%d\n", cc, lc, wc); + return 0; +}
\ No newline at end of file |