From 83e0861e200999ed46a1a1a8afa0b5638e48e14b Mon Sep 17 00:00:00 2001 From: "martin@ashbysoft.com" Date: Sat, 11 Jun 2022 21:25:01 +0000 Subject: ex1-9 ex1-10 --- ex1-10.c | 36 ++++++++++++++++++++++++++++++++++++ ex1-8.c | 3 ++- ex1-9.c | 22 ++++++++++++++++++++++ run | 2 +- 4 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 ex1-10.c create mode 100644 ex1-9.c 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 +#include +#include + +/* 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 diff --git a/ex1-8.c b/ex1-8.c index b692948..cc70b64 100644 --- a/ex1-8.c +++ b/ex1-8.c @@ -1,4 +1,5 @@ #include +#include int main(void) { int c; @@ -14,4 +15,4 @@ int main(void) { } printf("nl=%ld tb=%ld bl=%ld\n", nl, tb, bl); return 0; -} \ No newline at end of file +} diff --git a/ex1-9.c b/ex1-9.c new file mode 100644 index 0000000..e7d4d25 --- /dev/null +++ b/ex1-9.c @@ -0,0 +1,22 @@ +#include +#include +/* Copy stdin to stdout, replacing consecutive spaces with a single space + Edge case: a leading space is retained if there are leading spaces. + Edge case: an empty file just doesn't echo anything, but emits a warning on stderr */ +int main(void) { + int c = getchar(); + if (c == EOF) { + fprintf(stderr, "warning: no input\n"); + goto exit; + } + putchar(c); + bool bl = (c == ' '); + while ((c = getchar()) != EOF) { + if ((!bl) || (c != ' ')) { + putchar(c); + } + bl = (c == ' '); + } +exit: + return 0; +} \ No newline at end of file diff --git a/run b/run index 185f869..11c2851 100755 --- a/run +++ b/run @@ -4,4 +4,4 @@ cc -o exe $@ ./exe result=$? rm exe -exit $result \ No newline at end of file +exit $result -- cgit v1.2.3-ZIG