" Як уникнути натискання за Enterдопомогою getchar()
? "
Перш за все, вхід терміналу зазвичай є лінійним або повністю буферизованим. Це означає, що операційна система зберігає фактичний вхід з терміналу в буфер. Зазвичай цей буфер зливається з програмою, коли fe \n
сигналізується / надається stdin
. Це робить преса до Enter.
getchar()
знаходиться лише на кінці ланцюжка. Він не має можливості фактично впливати на процес буферизації.
" Як я можу це зробити? "
Кювет getchar()
в першу чергу, якщо ви не хочете використовувати певні системні виклики , щоб змінити поведінку терміналу явно , як добре пояснено в інших відповідях.
На жаль, немає стандартної функції бібліотеки, а з цим немає портативного способу очищення буфера при введенні одного символу. Однак існують рішення, що базуються на реалізації та не переносяться.
У Windows / MS-DOS, Є getch()
і getche()
функції вconio.h
файлі заголовка , які виконують саме те, що ви хочете - читає один символ, не потрібно чекати, поки новий рядок очистить буфер.
Основна відмінність між getch()
та getche()
полягає в тому, getch()
що не відразу виводить фактичний введений символ у консоль, тоді як getche()
робить. Додатковий "e"
стенд означає ехо .
Приклад:
#include <stdio.h>
#include <conio.h>
int main (void)
{
int c;
while ((c = getche()) != EOF)
{
if (c == '\n')
{
break;
}
printf("\n");
}
return 0;
}
У Linux, таким чином , щоб отримати безпосередню обробку і виведення символів полягає в використанні cbreak()
і echo()
варіантів і getch()
і refresh()
підпрограм в Ncurses-бібліотеці.
Зверніть увагу, що вам потрібно ініціалізувати так званий стандартний екран за допомогою initscr()
і закрити той самий за допомогою endwin()
процедур.
Приклад:
#include <stdio.h>
#include <ncurses.h>
int main (void)
{
int c;
cbreak();
echo();
initscr();
while ((c = getch()) != ERR)
{
if (c == '\n')
{
break;
}
printf("\n");
refresh();
}
endwin();
return 0;
}
Примітка: Вам потрібно викликати компілятор з -lncurses
опцією, щоб лінкер міг шукати та знаходити бібліотеку ncurses.