![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
alsav22 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 13.4.2012 Репутация: нет Всего: нет |
Есть некий ввод символов, организованный через cin.get(char &), или через cin.get(char &, int), или через cin.getline(char &, int). Выведена на консоль, например, фраза: "Введите то-то: ". Дальше мигает курсор (приглашение на ввод). Если вводится не то, что нужно, то на следующей строке выводится то же:"Введите то-то: " и курсор на ввод. Всё получается кроме одного: если просто нажать <Enter>, то курсор на ввод переходит на начало следующей строки. Как сделать чтобы этого не происходило? То есть, при нажатии на <Enter>, или курсор оставался на том же месте, или на следующей строке выводилось то же : "Введите то-то: " и курсор на ввод.
|
|||
|
||||
disputant |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 210 Регистрация: 28.11.2011 Репутация: нет Всего: 3 |
Проверьте, что введено, и если ничего - повторите запрос.
Лучше это делать в цикле... |
|||
|
||||
alsav22 |
|
||||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 13.4.2012 Репутация: нет Всего: нет |
В том-то и дело, что так не получается. Например, такая конструкция не работает как надо:
Сравнение происходит при втором нажатии <Enter>. При первом нажатии происходит переход на начало следующей строки. Дело,насколько я понимаю, в том, что эти функции, в не зависимости от того, что они делают с символом перевода строки, всегда его обрабатывают, т.е. выполняют. И вопрос в том, как сделать так, что бы они его или не обрабатывали, или, в результате обработки, выводилась таже надпись с курсором в конце. Это сообщение отредактировал(а) alsav22 - 15.5.2012, 13:12 |
||||
|
|||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
alsav22, забудь об операторе goto. НЕ ИСПОЛЬЗУЙ ЕГО НИКОГДА!!!
когда станешь опытным программистом, узнаешь, когда его можно использовать, а когда нет.
|
|||
|
||||
alsav22 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 13.4.2012 Репутация: нет Всего: нет |
Знаю я о goto. В пределах видимости можно. А по теме, ничего не предложите? Ваш код тоже перевод строки делает.
Это сообщение отредактировал(а) alsav22 - 15.5.2012, 14:06 |
|||
|
||||
disputant |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 210 Регистрация: 28.11.2011 Репутация: нет Всего: 3 |
Вот что имел в виду я:
Если вам позарез именно get, то добавьте считывание второго символа.
Но мне не нравится сама идея, потому что что вы будете делать, если пользователь введет не один символ, а строку? Проще брать строку и убеждаться, что в ней 1 символ. |
||||
|
|||||
alsav22 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 13.4.2012 Репутация: нет Всего: нет |
Благодарю! Я в первом посте насчёт cin.getline(char &, int) писал. Конечно с ней лучше.
|
|||
|
||||
alsav22 |
|
||||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 13.4.2012 Репутация: нет Всего: нет |
Получается, что это код у меня не работал только из-за лишнего cin.get(). Да и cin.clear(); там не нужен.
А чтобы работало (если в цикле сделать), когда вводится не один символ, можно, после тела if, воспользоваться такой конструкцией:
Это сообщение отредактировал(а) alsav22 - 15.5.2012, 15:29 |
||||
|
|||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 2 Всего: 50 |
я так делал:
https://bitbucket.org/skynowa/xlib/src/34ce...sole.cpp#cl-216
|
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
мой код относился к goto. И про этот оператор ты ничего не знаешь (то, как ты его использовал об этом и говорит). НЕ ИСПОЛЬЗУЙ ЕГО ВООБЩЕ!!! оператор нужен в одном из 100 случаев. Например, выход из циклов второй и более вложенности. Или, в языке С, для перехода на код отката изменений в случае ошибки (в С++ есть RAII и исключения, поэтому не актуально). |
|||
|
||||
alsav22 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 13.4.2012 Репутация: нет Всего: нет |
Про goto я знаю, что его нужно применять как можно реже, и на это есть определённые причины("спагетти" и пр.). Но, в данном конкретном коде, можете назвать причины, по которым его ЗДЕСЬ нельзя использовать (кроме причины, что не надо привыкать к дурному)? Что может произойти неправильного в данном коде из-за этого? Поверьте, что я действительно хочу в этом разобраться, а не просто тупо стою на своём.
|
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
alsav22, в данном конкретном коде проблем из-за goto нет. Разве что, читать не так удобно, как в случае с циклом.
Но, код редко остается неизменным всю свою жизнь. Рано или поздно могут быть внесены изменения. Потом еще изменения, и в итоге ты получишь слабо понятный глючный код (не забывай, что в отличие от С в С++ есть классы, объекты которых имеют определенные условия создания и уничтожения, а с помощью goto ты можешь испортить всю "малину", перескочив не туда). Короче. Не используй goto, как бы тебе этого ни хотелось. Уже миллион копий из-за него сломано. Если хочешь, можешь сам поискать дискуссии на эту тему в этом форуме. А для иллюстрации своих слов приведу пример. Я имею опыт работы с С/С++ около 15 лет. Из них где-то 7 я этими языками активно пользуюсь (до этого несколько маленьких утилиток в год писал). В моем коде (за все вермя работы!) оператор goto встречается около 10-ти раз. Из них один в С++ коде (дешифратор, использует расширение gcc - переход по указателю на метку, указатели хранятся в таблице; данный код легко переписывается через switch/case без потери производительности), а остальные в С-коде недописанного linux-драйвера (очистка контекста в случае ошибки). |
|||
|
||||
leniviy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: нет Всего: 5 |
Если по делу:
SetConsoleMode отключить ENABLE_ECHO_INPUT и ENABLE_LINE_INPUT читать посимвольно, выводить (если надо) всё, кроме '\n'. Недостатки: стрелочки и backspace не будут работать Это сообщение отредактировал(а) leniviy - 19.5.2012, 20:14 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |