Windows консоль выполняет обработку редактирования строки на стандартном вводе, позволяя использовать режим возврата, удаления, левого / правого курсора и режима вставки / перезаписи. Эти символы и нажатия клавиш не приводят к вставке символа во входной поток.
Вы можете отключить обработку ввода с помощью Win API SetConsoleMode()
. Например, ниже я переключил режим обработки и ввода строки так, чтобы getchar()
возвращался после каждого введенного символа:
#include <stdio.h>
#include <windows.h>
int main()
{
HANDLE stdin_handle = GetStdHandle(STD_INPUT_HANDLE);
DWORD console_mode = 0 ;
if( GetConsoleMode( stdin_handle, &console_mode) )
{
console_mode = console_mode & ~(ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT) ;
SetConsoleMode( stdin_handle, console_mode ) ;
}
int c = 0 ;
while( (c = getchar()) != EOF )
{
switch( c )
{
case '\t' : printf( "\\t" ); break ;
case '\b' : printf( "\\b" ); break ;
case '\\' : printf( "\\\\" ); break ;
case '\r' : putchar( '\n' ); break ; // Translate ENTER into Newline
default : putchar( c ); break ;
}
}
}
Однако это, вероятно, имеет нежелательные побочные эффекты, такие как интерпретация ENTER как \r
и для getchar()
не возвращаться при нажатии ENTER до тех пор, пока не будет введен следующий символ. Без сомнения, есть решение для этого, но я оставлю это для вас, чтобы экспериментировать. Это может быть конфликт между тем, что обработка stdin и Windows консольная обработка - и, возможно, использование функций ввода-вывода ReadConsole()
и Win API вообще может помочь?