Getch c не работает visual studio
Функция getch() ничего не делает, и моя программа застревает в строке getch()!
Я хочу получить ввод char в С++ с помощью getch(), но ничего не происходит, когда я запускаю этот код, и он застревает в char c= getch(), даже когда я что-то ввожу.
getch устарела на некоторых платформах. Вместо этого вы можете использовать std::cin , особенно если вы используете std::cout в своем коде.
На самом деле я хочу использовать его в игре в качестве ключевого ввода.
Это нужно ввести в консоль, но я этого не хочу.
Куда вы хотите ввести ключ? getch также требует ввода ключа в консоли.
Нет, я имею в виду, что в getch() вам нужно только нажать клавишу, но в cin вы должны нажать клавишу, а затем нажать клавишу ENTER.
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно.
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей.
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то.
Ответы 1
Мой проект был графическим, но в моем коде не было initwindow(lentgh,width) . Поэтому я добавил эту команду в свой код перед циклом, а затем попытался снова (нажав клавишу, когда графическое окно было открыто). Тогда это сработало! Я не знаю причину, но это ответ на мой вопрос.
Другие вопросы по теме
Нужна помощь в создании моей собственной функции getch () на C с использованием Windows API в консольном приложении.
Как выйти из программы или цикла Python с помощью комбинации клавиш или макроса? Keyboardinterrupt не работает
OverflowError: аргумент символа не находится в диапазоне (0x110000) с использованием getch в python 3.5
Я хочу организовать ввод пароля, чтобы вместо символа в консоли появлялись звездочка, если нажата клавиша Enter ввод заканчивается. Вместо одной звездочки при вводе символа появляются две, в чем проблема?
"Постарайтесь писать более развёрнутые вопросы. Для получения ответа поясните, в чём именно вы видите проблему, как её воспроизвести, что вы хотите получить в результате и т. д. Приведите пример, наглядно демонстрирующий проблему."
Я хочу организовать ввод пароля, чтобы вместо символа в консоли появлялись звездочка, если нажата клавиша Enter ввод заканчивается. Вместо одной звездочки при вводе символа появляются две, в чем проблема?
@SergeyGornostaev Да вот забавно. Под Open Watcom все нормально, а VC++ 2017 действительно делает повторное чтение символа 0 - но в документации об этом ничего нет.
4 ответа 4
Словом, как выяснилось, это баг. Который предлагают решать путем статической линковки с более старой версией рантайма C, но, понятно, что это метод, мягко говоря, очень невеселый.
Ждем обновлений Windows/Visual C++ с исправлением бага.
Update
VC++ 2017 15.8.7 - при компиляции с динамической библиотекой ( /MD ) работает нормально, при статической - нет.
Update2
Нормально работает при установке SDK версии 10.0.17763.0
Раз метка c++ , то используйте стандарт c++ : c++ ввод, c-style ввод в c++. Там функций _getch() и _putch() нет.
Как говорится что посеяли, то и пожинаете.
Условие вашего цикла: вводить символ, сравнить с числом 13, если нет равенства, то выводить звездочку. Вы вводите символ, потом нажимете enter , что является еще одним символом, потому и два раза выводится звездочка. Желаемый результат(чтобы выводить столько звездочек, сколько символов вводите, не учитывая пробел, можете получить так:
Как видите, все нужно контролировать самим, так почему же не воспользоваться инструментами, предоставленными библиотекой.
Нет, на VC++ действительно после чтения символа происходит второе чтение нулевого значения. Т.е. при вводе 5 букв и Enter получается 11 звездочек.
Компилятор: MiniGW
IDE: NetBeans
Исходный код программы:
Если убрать getch то всё работает!
Та же самая ошибка при использовании system и остальных кодов.
Почему он не хочет их компилировать?
_getch();
system("pause >> void");
getchar();
cin.get();
Пользуйтесь лучше Visual Studio
Заголовочный файл conio.h и функция getch оттуда не входят в стандарт С и С++, поэтому у вас их просто нет. Функция system определена в С++ в файле cstdlib.
Наверное, вы написали этот код не сами, а нашли в какой-то книге по С++. Так вот, ваша книга предлагает использовать нестандартный С++, что говорит о ее низком качестве. Попробуйте поискать другую литературу. Например, можно посмотреть этот список. Многое из него переведено на русский
Спасибо за помощь!
Просто я учусь по книге C++ за 21 день (нет я не хочу выучить его меньше чем за месяц,просто книгу порекомендовали) и использую сторонние примеры. Теперь буду смотреть на разделы форумов.
Tostich: Если эта книга за авторством Джесса Либерти, то не очень рекомендую. Я сам по ней учился.
Но с нуля, лучше учиться по другим книгам, которые дают сразу С++ подход, а не сначала C, а потом С++.
В общем, очень рекомендую книги, которые ставят сразу C++ мышление.
Лолшто, языки-то разные. Но, во-первых, С++, хоть это будет и не совсем корректно, но можно считать надмножеством С. А во-вторых, С позволяет прочувствовать работу кода. Изучение необходимых для этого основ С не занимает много времени. И пусть программист не станет в дальнейшем использовать специфичные возможности С, ему будет гораздо проще быстро и корректно вникнуть в то, о чем рассказывают авторы книг про другие языки, в частности, про С++.
Влад Гвер это в теории. А на практике человек будет писать на адовой смеси языков, где cout соседствует с getch и exceptions с malloc
Я пробовал использовать getch () и kbhit () для чтения ввода пользователя, но, похоже, он не распознает нажатие клавиши.
Этот код печатает «start» и ничего не печатает при нажатии клавиши. Мне не удалось использовать getch () для чтения и печати даже одного символа без цикла.
Не могу воспроизвести. Но с другой стороны, kbhit() и getch() не являются стандартными функциями, поэтому их характеристики могут отличаться. Возможно, вы могли бы в качестве первого шага привести свой стандарт кода в соответствие с int main(void) < и return 0; в конце main . Откуда берутся эти функции kbhit() и getch() ? Какой компилятор и платформа?
Вы пробовали if(kbhit()) без сравнения с 1?
Если я помню, они являются частью conio.h , который есть в старых компиляторах для Windows, таких как Turbo C. Конечно, это взрыв из прошлого, когда появилась эта функция, которой я не пользовался уже 20 лет.
@paddy по-прежнему поставляется с Visual Studio в 2018 году.
Ха! Это так? Думаю, я перешел к использованию Win API и больше никогда не смотрел на этот заголовок.
@paddy Теперь вы знаете, что делать, когда чувствуете ностальгию;)
@Swordfish Они взяты из версии WinBGI моего университета. Я использую VS2013 для компиляции кода. Мне удалось заставить их работать в другом коде, где я также использовал void main () и использовал их в цикле, который я вставил. Единственное отличие состоит в том, что программа выполняла и другие действия в цикле while (рисовала круги и перемещала их, используя вводимые пользователем данные).
Текущий ответ правильный ( kbhit возвращает ненулевое значение, которое нет обязательно совпадает с 1). Вам также следует проверить документацию для получить, поскольку ваша текущая логика немного странная. Обычно вы должны использовать возвращаемое значение, чтобы проверить наличие управляющего символа и выполнить второй вызов getch . У вас также есть цикл занятости, который будет как сумасшедший крутиться на одном из ядер вашего процессора. Вы можете добавить туда небольшую задержку (например, Sleep(30) ) для здравомыслия.
Существует множество библиотек под названием WinBGI и т.п. Разве ваш университет не предоставляет для этого документацию? Вы уверены, что kbhit() возвращает 1? Вы пробовали if(kbhit()) без сравнения с 0? - где я также использовал void main () - Неважно, что компилирует Visual Sudio 2013 или нет, это int main(void) в соответствии со стандартом языка C. Пожалуйста, используйте это. Кроме того: почему вы используете VS2013 в 2018 году? Visual Studio 2019 скоро выйдет.
. так что это должен быть if (kbhit()) , и обратите внимание, что getch возвращает "escape" значения для функциональных клавиш, клавиш курсора и т. д., которые должны быть обнаружены и если так вызываются дважды. Вы можете написать простую тестовую программу, чтобы проверить это.
Во время недавних археологических раскопок в Кремниевой долине археологи были рады найти руководство по библиотеке BGI Borland Turbo C. C14 датировал его 1988 годом. Он был в плохих условиях, но среди вещей, которые все еще можно было прочитать, была страница kbhit , на которой говорилось: «Возвращаемое значение Истинное (ненулевое), если есть символ во входном буфере, в противном случае - ложь». Если вы используете эти функции в археологических целях, что может быть единственной причиной их использования, замените if (kbhit() == 1) на if(kbhit()) .
Приносим извинения. Запрошенное содержимое было удалено. Вы будете автоматически перенаправлены через 1 секунду.
Лучший отвечающий
Вопрос
- Изменен тип Maksim Marinov Microsoft contingent staff, Moderator 17 августа 2015 г. 6:47 тема не активна
- Изменен тип Maksim Marinov Microsoft contingent staff, Moderator 17 августа 2015 г. 6:47 ошибка
Ответы
Приложение Windows начинает исполнение кода не с главной функции Вашей программы. Главная функция вызывается средой .net после некоторых подготовительных операций. Запуск отладки клавишами F10-F11, предназначенными для пошаговой отладки останавливают программу именно в этом "подготовительном" коде, исходный код которого, действительно, отсутствует. И символы здесь не помогут. Отладку следует начинать с установки точек прерывания в своем коде, а запускать клавишей F5.
А это предупреждение говорит о том, пошаговая отладка аксессоров get и set свойств отключена (по умолчанию, действительно, так и есть) и предлагает ее включить.
Все ответы
Приложение Windows начинает исполнение кода не с главной функции Вашей программы. Главная функция вызывается средой .net после некоторых подготовительных операций. Запуск отладки клавишами F10-F11, предназначенными для пошаговой отладки останавливают программу именно в этом "подготовительном" коде, исходный код которого, действительно, отсутствует. И символы здесь не помогут. Отладку следует начинать с установки точек прерывания в своем коде, а запускать клавишей F5.
А это предупреждение говорит о том, пошаговая отладка аксессоров get и set свойств отключена (по умолчанию, действительно, так и есть) и предлагает ее включить.
Спасибо. Вы мне помогли разобраться. Но у меня возник вопрос другой. Как отладку делать клавишей F11? Сначала точки останова, потом F5, а потом F11?
Я думал, что шаг с заходом я делаю по своему коду. В предыдущих версиях студии всё работало, я шагал по своему коду. А тут и в настройках отладки поменял параметры, всё равно не шагает. Иногда спрашивает файл appdomain.cs и указывает путь, по которому ищет этот файл, не существующий на моем компьютере.
Что работало? Что Вы вкладываете в понятие "шаг с заходом"? Заход осуществляется в функцию (метод). Если метод Ваш, Вы увидите исходный код, в противном случае - нет. Что может быть не понятно?
По-моему шаг с заходом после нажатия F11 это когда можно передвигаться по коду, заходить в процедуры, например в процедуру клика по кнопке, пошагово выполнять каждый оператор и при наведении курсора мышки показываются значения переменных. Сейчас это доступно, когда установлена точка останова, нажата клавиша F5, а уже после этого можно нажимать F11. Раньше было достаточно F11 только, чтобы посмотреть как выполняется программа.
Здравствуйте, Вы разобрались в проблеме? Пожалуйста для тех кто в танке помогите решить аналогичную, в комментариях подытожено кем то ". что еще не понятно", остается только сказать ". ну не понятно" чуть подробней плиз
для примера создал небольшой новый проект winForms в нем форма и таймер. При отладке (точка останова), клавишей F11 (шаг с заходом) добирается до первого условия и выдает также исходный код не найден пытается найти int32.cs в ДРУГИХ случаях другой потерянный файл и так все время(
в данном случае точка останова возле if (ids>2), три нажатия F11 и выходит ЗЛОСТНОЕ непреодолимое препятствие: "файл не найден"
При отладке (точка останова), клавишей F11 (шаг с заходом) добирается до первого условия и выдает также исходный код не найден пытается найти int32.cs в ДРУГИХ случаях другой потерянный файл и так все время(
в данном случае точка останова возле if (ids>2), три нажатия F11 и выходит ЗЛОСТНОЕ непреодолимое препятствие: "файл не найден"
Во-первых, не могу понять, почему нужно пытаться обязательно делать ШАГ С ЗАХОДОМ в метод (в Вашем случае в операцию сравнения "больше" структуры Int32), не принадлежащий Вашей программе и исходного кода которого точно нет на локальной машине?
Во-вторых, не знаю в какой версии VS Вы работаете, а у меня в VS 2017 Community описанное Вами поведение студии не наблюдается. Отладчик благоразумно обходит отсутствующий исходный код (даже по F11) и переходит к следующей строке.
Посмотрите настройки отладки (особенно, отмеченные на рисунке пункты):
Читайте также: