You'll certainly get an extra character on output, but I can't see why it would be an extra 'y'.
The problem is that you write each character to the screen *before* testing if it's an end of file mark. The classic way to write this loop is to get the first character outside the loop:
c = fgetc(input);
while (c != EOF)
.... fputc(c, output); /* write a known-good character */
.... c = fgetc(input);
It's quite common to see C/C++ use the fact that an assignment is an expression and not a statement in those languages, to see the loop shortened to:
while ((c = fgetc(input) != EOF)
.... fputc(c, output);
That both reads a character and tests for end of file within the while condition.
There are a couple of other issues in that code:
1. The variable c should be an int, not a char. The fgetc() function returns an int, and there's no guarantee that the EOF constant will fit into a char. You'll find that char values are widened to int in most C expressions and int types are used for argument and return types throughout the C Standard Library.
2. You are opening output as a FILE*, but never writing to it. I assume that's just for debugging. I changed the printf() to fputc() in my example, assuming that's what you'll eventually use.
3. You are using printf() to output single characters. Very inefficient. Use fputc() for opened files or putchar() for stdout when you want to write a character without any formatting.
4. You are opening an input and an output file, but only closing the input file. Technically, you should close *all* files you open with fopen(); but you really, really, really should close files opened for output. There's no guarantee that the final data will be properly written if program termination closes an output file.