The do-while executes, then checks the while condition. So when cin.good() returns something <=0, it has already executed the iteration for that case. Thus, the single extra character.
You could get rid of the do, and just make a while loop. This will check the condition before each iteration, thus if cin.good() is bad, you don't execute. You would have to put one cin>>thischar before the loop to get a valid cin.good(), then the loop will check the condition before each iteration.
Or maybe if you put one cin>>thischar before your do-while, then move the one you already have to the end of the loop, right after the cout. It's probably better to do it the first way though, that way it will bail out even if the very first input is bad.