ID Number: Q58427
5.10 6.00 6.00a 6.00ax | 5.10 6.00 6.00a
MS-DOS | OS/2
Summary:
SYMPTOMS
In Microsoft C versions 5.1, 6.0, 6.0a, and 6.0ax, when a ^Z
(CTRL+Z) is entered for a string input in response to gets() or
scanf(), the next line does not prompt for an input.
CAUSE
Because STDIN is a predefined file pointer opened in text mode, and
a ^Z character is an end-of-file marker in MS-DOS, the ^Z character
automatically closes the file pointer. The gets() or scanf()
function does not stop to accept input from STDIN following the
previous input containing a ^Z character.
RESOLUTION
To work around this problem, change the translation mode of STDIN
from text mode to binary mode. Because the ^Z character is not
translated as an end-of-file character in binary mode, the gets()
from the following example accepts input only following a ^Z from
STDIN after the translation.
More Information:
To change STDIN from text mode to binary mode, use the setmode()
run-time function to change the translation mode. The following code
demonstrates this behavior, and includes the setmode() function to
show how to change STDIN from text mode to binary mode. Remove the
comment delimiters to observe the difference in the program's behavior
after adding the setmode() function.
Sample Code
-----------
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
void main (void)
{
char str1[20];
/* if( setmode ( fileno ( stdin ), O_BINARY ) == -1 )
perror ( "Cannot set stdin to binary mode" );
else
printf ( "stdin mode successfully set to binary\n" );
*/
do {
printf ( "Enter a string : " );
gets ( str1 );
} while ( strcmp( str1,"n" ) );
}
Compile the above code and run the program. If you enter a string and
then press the ENTER key, the program will loop and prompt for another
string. However, if at the prompt you enter a ^Z or a string followed
by a ^Z, the program will loop indefinitely. The program does not
pause at the gets() statement and wait for your input.
Now, uncomment the if-else clause. Recompile the program and run it.
Input that includes a ^Z character is now accepted without infinite
looping.
Additional reference words: 5.10 6.00 6.00a 6.00ax