Edward Bartolo <edb...@gmail.com> writes: [...]
> On page Page 34 Exercise 1-9 > "Write a program to copy its input to its output, replacing each > string of blanks one ore more blanks by a single blank." > > I wrote the following, tested it, and seems to work, but I think it is > too complicated. Any suggestions? > > -------------------------- > #include <stdio.h> > > int main() > { > int c, d = 0; > while ((c = getchar()) != EOF) { > if (c != ' ') { > d = 0; > putchar(c); > } > if (c == ' ' && d == 0) { > putchar(c); > d = 1; > } > } > > return 0; > } > ---------------------------- Conventional approach using a state variable: -------- #include <stdio.h> int main(void) { int c, blanks; blanks = 0; while ((c = getchar()) != EOF) { if (blanks) { if (c == ' ') continue; blanks = 0; } else blanks = c == ' '; putchar(c); } return 0; } -------- Less conventional approach using a function pointer as state variable. NB: This is really overkill here but very helpful in case of (much) more complicated state machines. -------- #include <stdio.h> static void put_a_char(int); static void (*process_char)(int) = put_a_char; static void skip_blanks(int c) { if (c == ' ') return; process_char = put_a_char; putchar(c); } static void put_a_char(int c) { putchar(c); if (c == ' ') process_char = skip_blanks; } int main(void) { int c; while ((c = getchar()) != EOF) process_char(c); return 0; } -------- _______________________________________________ Dng mailing list Dng@lists.dyne.org https://mailinglists.dyne.org/cgi-bin/mailman/listinfo/dng