From: "John M. Aldrich" Newsgroups: comp.os.msdos.djgpp Subject: Re: Trouble with getche() Date: Wed, 09 Oct 1996 20:05:21 -0700 Organization: Three pounds of chaos and a pinch of salt Lines: 69 Message-ID: <325C67F1.32B4@cs.com> References: <325B1E56 DOT 5BDA AT erols DOT com> Reply-To: fighteer AT cs DOT com NNTP-Posting-Host: ppp118.cs.com Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit To: tonys111 AT erols DOT com To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Tony Sideris wrote: > > I'm trying to do this simple little C thing, but it won't work right...I > copied it right out of a C book. > Here's what I type: > After I compile it, I run it and the cursor just goes to next line > (which is blank) and does nothing. Then, for example, I type p it says: > > pType a character: > You typed: p As others have mentioned, you're trying to mix buffered (printf) and unbuffered (getche) output functions, which can lead to trouble no matter what you do. What they didn't mention is that even if you do use fflush() to clear the stdout buffer after a printf(), you may still have problems. The functions all write directly to text screen memory, not to DOS, so if somebody tries to redirect the output from your program, the 'echoed' keystroke will still appear on the screen. Moreover, if somebody tries to redirect the input, it won't work, because getche() reads the keyboard buffer directly. There are two solutions to this dilemma: 1) Use standard getc() - or even better, fgets( ..., stdin ) - to read input normally. This forces the user to press Enter to get their keystroke(s) accepted, but it allows both input and output redirection. 2) Use cprintf() along with getche(). cprintf() is the conio equivalent of printf which writes directly to the screen memory. You won't be able to redirect i/o with cprintf()/getche(), but you will always see everything on the screen as you print it because cprintf() isn't buffered. However, you have to watch out for the user pressing special keys like the arrow, Alt-, and function keys. These will make getch() and getche() behave strangely. BTW, you REALLY should get in the habit of using header files. The above program should have at least and for correctness. Try compiling it with '-Wall' and see what happens, i.e.: gcc -Wall -g -O -o myprog.exe myprog.c You should get lots of warnings about implicit function declarations. Read up on the gcc docs to see what these valuable switches do. This is what your program _should_ look like: #include #include int main( void ) { char ch; cprintf( "Type a character: " ); ch = getche( ); cprintf( "\nYou typed: %c", ch ); return 0; } HTH, John -- --------------------------------------------------------------------- | John M. Aldrich, aka Fighteer I | fighteer AT cs DOT com | | Proud owner of what might one | http://www.cs.com/fighteer | | day be a spectacular MUD... | Plan: To make Bill Gates suffer | ---------------------------------------------------------------------