0

The following code is from K&R The C Programming Language.

I compile the code with gcc wordCount.c on a UNIX system through putty. After compiling I run ./a.out and regardless of what arguments I pass after ./a.out it returns nothing and loops infinitely.

I am a C beginner, and I am very lost but very enthusiastic to learn. Could anyone point me in the right direction?

/* This program is a bare-bones version of the UNIX program wc. */

#include <stdio.h>

#define IN 1 /* inside a word */
#define OUT 0 /* outside a word */

/* count lines, words, and characters in input */
int main(void) {
    int c, nl, nw, nc, state;

    state = OUT;
    nl = nw = nc = 0;
    while ((c = getchar()) != EOF) {
        ++nc;
        if (c == '\n')
            ++nl;
        if (c == ' ' || c == '\n' || c == '\t')
            state = OUT;
        else
        if (state == OUT) {
            state = IN;
            ++nw;
        }
    }
    printf("%d %d %d\n", nl, nw, nc);
    return 0;
}
chqrlie
  • 131,814
  • 10
  • 121
  • 189
Link79097
  • 68
  • 3
  • 6
  • 7
    `int main(void)` says the program ignores its arguments. It reads its standard input. Type some words at it. On several lines. Indicate EOF (end of file) with Control-D. It should report the three numbers at the end. – Jonathan Leffler Feb 13 '16 at 21:18
  • Ah! Makes sense, thank you very much! – Link79097 Feb 13 '16 at 21:29
  • 2
    Try `echo a b c | ./a.out` **or** `./a.out < a b c` – Elliott Frisch Feb 13 '16 at 21:52
  • echo a b c | ./a.out or something like: cat textFile.txt | ./a.out works as well. This is also what I was looking for. Thanks a ton!!! – Link79097 Feb 13 '16 at 21:56
  • **Note:** you can add `if (state != OUT) nl++;` before the `printf` statement to account for files without a POSIX end of file (`newline` terminating the last line). As the code is now, the line count will be 1-short with a non-POSIX end of file. – David C. Rankin Feb 13 '16 at 23:11

0 Answers0