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

Reply via email to