In the for-loop statement, you’re having the bug.
for(ch = getchar(); (ch = getchar()) != EOF; lch = ch){...}
Here, you’re storing first character in ch, and then again testing if (ch!=EOF) by again reading character input.
Remove ch=getchar() from the initialisation statement; let it be in the second part.
for(;(ch = getchar()) != EOF; lch = ch){...}
Also, you will have to initialise your lch before making it run as lch will not have any value stored in it before making comparison in the first iteration of the loop. So, let lch=0 be initialised first.
for(lch = 0; (ch = getchar()) != EOF; lch = ch){...}
Consider enabling warnings in your compiler, it would probably detect and warn about this issue, so you could fix it.
The above would solve your problem.
(Thanks to Blue Moon and hyde for helping me modify the answer.)