Как сказать 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);
}

Объяснение кода листинга программы

В этом коде:

  1. Скачиваются библиотеки iostream.h и windows.h.
  2. Создается функция main().
  3. Объявляются переменные N и M типа int.
  4. Осуществляется получение дескриптора стандартного вывода с помощью функции GetStdHandle() с параметром STD_OUTPUT_HANDLE.
  5. Устанавливается позиция курсора с помощью функции SetConsoleCursorPosition() с аргументом hConsole, равным полученному дескриптору, и позицией X=4, Y=1.
  6. Выводится приглашение для ввода длины массивов X и Y с помощью функции printf().
  7. Устанавливается позиция курсора после вывода приглашения с помощью функции SetConsoleCursorPosition().
  8. Скачивается длина массива X с помощью функции scanf() и передачей адреса переменной N.
  9. Устанавливается позиция курсора после ввода длины массива X с помощью функции SetConsoleCursorPosition().
  10. Скачивается длина массива Y с помощью функции scanf() и передачей адреса переменной M.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.4 из 5
Похожие ответы