Your problem is with your preprocessor definitions of IN
and OUT
:
#define IN 1; /* inside a word */
#define OUT 0; /* outside a word */
Notice how you have a trailing semicolon in each of these. When the preprocessor expands them, your code will look roughly like:
if (c == ' ' || c == '\n' || c == '\t')
state = 0;; /* <--PROBLEM #1 */
else if (state == 0;) { /* <--PROBLEM #2 */
state = 1;;
That second semicolon causes the else
to have no previous if
as a match, because you are not using braces. So, remove the semicolons from the preprocessor definitions of IN
and OUT
.
The lesson learned here is that preprocessor statements do not have to end with a semicolon.
Also, you should always use braces!
if (c == ' ' || c == '\n' || c == '\t') {
state = OUT;
} else if (state == OUT) {
state = IN;
++nw;
}
There is no hanging-else
ambiguity in the above code.