Как сказать scanf-у не переводить строку после нажатия Enter? - C (СИ)
Формулировка задачи:
Мне надо, чтобы после ввода, курсор в консоли оставался на прежнем месте. Частично, этого я смог добиться при помощи функции
SetConsoleCursorPosition
, установив курсор после ввода в нужное место. Но если нажать энтер, не введя ничего, или пока scanf не считает требуемое количество чисел, нажатие энтера приведет к возврату каретки с переводом на новую строку и не было бы проблемы, если бы с энтером сканф завершал свою работу, я бы проверил сколько чисел он считал и после этого установил бы курсор в нужное место, но сканф все так же ждет ввода чисел. Пытался использовать"%[^\n]"
но ничего путного из этого не вышло. Можете вообще объяснить доступно принцип работы потока ввода? Я понимаю это так: все что вводится с клавиатуры сразу попадает в поток, затем обрабатывается, если это не управляющий символ то просто выводится, скажем, нажав в консоли клавишу "а", я закину символ "а" в поток ввода, тот чем-то обработается и выведется на экран, если после этого я допишу что-нибудь еще, произойдет тоже самое, а вот если я нажму клавишу "backspace" символ "\b" попадет в поток, обработается, после чего произойдет отбрасывание предыдущего символа из потока и символа "\b", после отображение в консоли перевода каретки на одну позицию влево, нажатие энтера приведет к записи символа "\n" в поток, и отображение его в консоли в виде перевода каретки на новую строку. Поправьте где ошибаюсь, и дополните пожалуйста, если что-то упустил, просто в интернете не нашел ничего настолько разжеванного, возможно не правильно искал.Решение задачи: «Как сказать scanf-у не переводить строку после нажатия Enter?»
textual
Листинг программы
#include <stdio.h> #include <windows.h> int main() { int N, M; COORD position; HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); position.X = 4; position.Y = 1; printf("Enter arrays length:\nX = \nY = "); SetConsoleCursorPosition(hConsole, position); ++ position.Y; scanf("%d", &N); SetConsoleCursorPosition(hConsole, position); scanf("%d", &M); }
Объяснение кода листинга программы
В этом коде:
- Скачиваются библиотеки iostream.h и windows.h.
- Создается функция main().
- Объявляются переменные N и M типа int.
- Осуществляется получение дескриптора стандартного вывода с помощью функции GetStdHandle() с параметром STD_OUTPUT_HANDLE.
- Устанавливается позиция курсора с помощью функции SetConsoleCursorPosition() с аргументом hConsole, равным полученному дескриптору, и позицией X=4, Y=1.
- Выводится приглашение для ввода длины массивов X и Y с помощью функции printf().
- Устанавливается позиция курсора после вывода приглашения с помощью функции SetConsoleCursorPosition().
- Скачивается длина массива X с помощью функции scanf() и передачей адреса переменной N.
- Устанавливается позиция курсора после ввода длины массива X с помощью функции SetConsoleCursorPosition().
- Скачивается длина массива Y с помощью функции scanf() и передачей адреса переменной M.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д