Subject: fgetc and getchar, how do I stop echo.
To: 'netbsd-help' <netbsd-help@NetBSD.ORG>
From: John Maier <johnam@datastorm.com>
List: netbsd-users
Date: 04/23/1997 21:08:46
I have a question about fgetc and getchar.

I want to be able to create a menu so the user needs only to press a letter
to activate a function.

The functions fgetc and getchar are suppose to perform functions like this.
However I have found that a <CR> needs to entered before any more code is
allowed to execute.

I have tried setvbuf( stdin, NULL, _IONBF, 0 ) but fgetc still buffers
the input data.

Another problems is the echoing of characters to the screen.  For example,
I want all of the data entered by the user to be upper case, regardless
the state of the CapsLock key.  This would require me to:
1) handle each character as it comes in.
2) Echo the data to the console.

Simple program to show what I basically want to do:
#include<stdio.h>
#include<string.h>

void main(void)
{
	char szTempStr[2] = " \0";
	char szUpperCase[80];

	setvbuf( stdin, NULL, _IONBF, 0 ); /* no buffering */

	while(*szTempStr != '\n') /* loop until the EOL character is found */
	{
		*szTempStr = fgetc(stdin);	/* get character from input stream */
		
		if(*szTempStr > 0x5a)		/* if the character is higher than 0x5a (Z) */
			*szTempStr = *szTempStr - 0x20; /* make character upper case */

		strcat(szUpperCase, szTempStr); /* build the string following the command */
		printf("%c", *szTempStr);		/* print single upper case character */
		
	}
}

The only problem is, it doesn't work right, or should I say, as I expect it to.

Any help or ideas would be appreciated.

jam