Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/34: Рейтинг темы: голосов - 34, средняя оценка - 4.91
1 / 1 / 1
Регистрация: 15.03.2016
Сообщений: 47
1

Как сказать scanf-у не переводить строку после нажатия Enter?

10.04.2016, 20:03. Показов 6452. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Мне надо, чтобы после ввода, курсор в консоли оставался на прежнем месте. Частично, этого я смог добиться при помощи функции SetConsoleCursorPosition, установив курсор после ввода в нужное место. Но если нажать энтер, не введя ничего, или пока scanf не считает требуемое количество чисел, нажатие энтера приведет к возврату каретки с переводом на новую строку и не было бы проблемы, если бы с энтером сканф завершал свою работу, я бы проверил сколько чисел он считал и после этого установил бы курсор в нужное место, но сканф все так же ждет ввода чисел.
Пытался использовать "%[^\n]" но ничего путного из этого не вышло.
Можете вообще объяснить доступно принцип работы потока ввода?
Я понимаю это так: все что вводится с клавиатуры сразу попадает в поток, затем обрабатывается, если это не управляющий символ то просто выводится, скажем, нажав в консоли клавишу "а", я закину символ "а" в поток ввода, тот чем-то обработается и выведется на экран, если после этого я допишу что-нибудь еще, произойдет тоже самое, а вот если я нажму клавишу "backspace" символ "\b" попадет в поток, обработается, после чего произойдет отбрасывание предыдущего символа из потока и символа "\b", после отображение в консоли перевода каретки на одну позицию влево, нажатие энтера приведет к записи символа "\n" в поток, и отображение его в консоли в виде перевода каретки на новую строку. Поправьте где ошибаюсь, и дополните пожалуйста, если что-то упустил, просто в интернете не нашел ничего настолько разжеванного, возможно не правильно искал.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.04.2016, 20:03
Ответы с готовыми решениями:

Как считать строку scanf'ом при этом не переходя на новую строку, т.е. без использования Enter'а
Как считать строку scanf'ом при этом не переходя на новую строку, т.е. без использования Enter'а,...

textbox.Multiline = true; не переводить строку по Enter
Есть текстбокс с Multiline = true. Как сделать, чтобы при нажатии в нем enter не создавалась строка?

После нажатия клавиши Enter или нажатия на Button
Помогите пожалуйста.:-[ Задача: После нажатия клавиши Enter или нажатия на Button поле курсора...

Как поставить каретку в начало после нажатия Enter в richtextbox?
В приложении перед тем, как вводить данные в richtextbox, нужно нажать Enter. Но после этого у меня...

7
737 / 542 / 416
Регистрация: 17.09.2015
Сообщений: 1,601
10.04.2016, 20:35 2
HepoH, вот здесь посмотри:Цикл выполняется через раз игнорируя считывание с клавиатуры
0
1 / 1 / 1
Регистрация: 15.03.2016
Сообщений: 47
10.04.2016, 20:54  [ТС] 3
LFC, там-то мне понятно что произошло. С консоли в поток было отправлено 2 символа, какая-то буква и энтер. Сначала сканф считал в переменную введенную букву и прошелся по свитчу в соответствии с ней, если это была не "е", после которой происходит выход из вайла, то он заходит на второй круг, и пишет в переменную оставшийся символ энтера, которого нету в свитче, поэтому выполняется дефолт. К сожалению, применимого к моей ситуации я ничего не нашел(
0
737 / 542 / 416
Регистрация: 17.09.2015
Сообщений: 1,601
10.04.2016, 21:00 4
HepoH, ты до конца прочитал?там старшие товарищи довольно подробно объясняют как бороться со scanf чтобы убрать лишние \n \r из буфера. Проблема та же что и у тебя просто в другом коде

Добавлено через 1 минуту
там еще 2-я страница есть если че
0
1 / 1 / 1
Регистрация: 15.03.2016
Сообщений: 47
10.04.2016, 21:19  [ТС] 5
LFC, я прочитал тему до конца, включая еще одну, которая была дана в конце. На второй странице тема ушла вообще в другую сторону на мой взгляд. Правильно ли я понял, что если убрать символ "\n" из буфера, то курсор вернется обратно? Если так, то все становится разительно проще

Добавлено через 16 минут
LFC, перечитал еще раз, про то что после работы scanf, в потоке остается то, что он не забрал мне уже было известно, проблема то не в том, что в потоке есть символ "\n", scanf на него не смотрит, проблема в том что строка переводится,а scanf по-прежнему ждет, пока в поток не попадет либо то, что он ожидает, либо то чего он не ожидает (например буква, когда scanf принимает числа, тогда он просто сломается - в потоке будут висеть буквы, а сканф будет об них каждый раз спотыкаться)
0
737 / 542 / 416
Регистрация: 17.09.2015
Сообщений: 1,601
11.04.2016, 08:46 6
HepoH, рассуждая на пальцах,не видя кода,мы конечно далеко уйдем.
0
1 / 1 / 1
Регистрация: 15.03.2016
Сообщений: 47
11.04.2016, 08:53  [ТС] 7
К примеру вот:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#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);
}
Если что-то вводить, то курсор будет устанавливаться в нужное мне место.
Меня интересует случай, когда нажимается энтер без ввода любых символов
0
12 / 12 / 10
Регистрация: 08.04.2016
Сообщений: 206
11.04.2016, 19:13 8
Если проблема лишь в этой программе, то попробуйте запретить нажатие первой клавишей клавиши ввода. её код в раскладке клавиатуры 0х000D; конечно прога не в одну строчку но возможность есть. при помощи цикла while. Если ищите уже готовую функцию то не знаю) мне вот интересно можно ли вместо перевода строки сделать enter как горизонтальную табуляцию) я только начинаю учиться и этот вопрос меня интересует с самого начала ) спс).
0
11.04.2016, 19:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.04.2016, 19:13
Помогаю со студенческими работами здесь

После нажатия enter пролетели в ряд строки кода с текстом. Как сделать?
надо чтоб после нажатия enter пролители в ряд строки кода с текстом когда нажали enter...

Как можно заставить программу выполнять определенные действия после нажатия клавиши ENTER
кто-нибудь может подсказать!! я новенький в VB и почти ни какого опыта программирования в этой...

Ввод в строку до нажатия Enter
Добрый вечер.Нужна функция,которая бы прибавляла к строке слова до тех пора,пока не будет нажат...

После загрузки биоса Windows грузится только после нажатия enter + f4
Люди, что это может быть если после загрузки биоса винда грузится только после нажатия enter + f4?...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru