Простая программа «нажатия клавиш» - PullRequest
0 голосов
/ 19 мая 2011

Я только начинаю на C ++ и пытаюсь понять, как определить, какая клавиша была нажата.Я понимаю, что ASCII-код для 'a' равен 97. Итак ...

1) Что не так со следующей программой?

#include <iostream>
using namespace std;

int main()
{
char thing[1];

cin >> thing;
if (thing == 97)
    cout << "You pressed 'a'!\n";
return 0;
}

2) Как сделать так, чтобывместо того, чтобы вводить букву в качестве ввода и нажимать ввод, программа просто сразу же принимает нажатие клавиши?

Ответы [ 3 ]

3 голосов
/ 19 мая 2011

Я только начинаю на C ++

Welcome! Я знаю, что вы найдете обучение программированию на С ++ одновременно запутанным и приятным. Могу ли я предложить вам сначала приобрести хорошую книгу по С ++? Здесь есть превосходный список таких книг: The Definitive C ++ Book Guide и List

1) Что не так со следующей программой?

#include <iostream>
using namespace std;

Вы не должны импортировать все пространство имен std. В этом пространстве имен много символов, и в какой-то момент вы почти наверняка столкнетесь с одним из них. Я знаю, что многие учебники для начинающих учат вас делать это. Не.

int main()
{
  char thing[1];

Нет оснований объявлять thing массив. Это должно быть char thing;.

  cin >> thing;

Потому что, когда вы делаете это, вы создаете ошибку переполнения буфера. Поскольку thing является массивом, cin будет обрабатывать thing как строку в стиле C и с радостью записывать в нее всю строку ввода, даже если она не подходит.

if (thing == 97)
  cout << "You pressed 'a'!\n";
  • (при условии, что вы не исправили определение thing), thing==97 сравнивает массив с константой 97. Более конкретно, он сравнивает адрес первого элемента массива с константой 97. Это плохо и, вероятно, даже не скомпилируется.
  • (Предполагая, что вы исправили определение thing), открытая константа 97 сбивает с толку читателей вашего кода, в том числе и вас. Вместо этого сравните thing с одинаково действительной интегральной константой 'a'.

Собираем все вместе:

#include <iostream>
using std::cout;
using std::cin;

int main()
{
  char thing;

  cin >> thing;
  if (thing == 'a')
    cout << "You pressed 'a'!\n";
  else
    cout << "You pressed not-'a': " << thing << "\n";
  return 0;
}

2) Как я могу сделать так, чтобы вместо того, чтобы вводить букву в качестве ввода и нажимать ввод, программа просто сразу же принимает нажатие клавиши?

Как уже отмечали другие, для этого вы должны использовать API для конкретной платформы. В Microsoft Windows попробуйте getch().

1 голос
/ 19 мая 2011

1)

cin >> thing

небезопасно, если они нажимают более одного символа перед нажатием Enter, так как вы выделили пространство только для 1 символа.

Кроме того, вы хотите

if(thing[0] == 97) // ...

2) Стандартного способа не существует. Функция getch() работает на некоторых платформах.

0 голосов
/ 19 мая 2011

Используйте функцию _getch(), чтобы дать вам символ, не дожидаясь клавиши ввода. Просто включите conio.h и используйте его.

Он работает в Windows, но в Visual C ++ он объявлен устаревшим. Так что это нестандартный способ и не переносимый.

#include <iostream>
#include <conio.h>

using namespace std;

int main()
{
    int character;

    character = getch_();
    if (character == 97)
        cout << "You pressed 'a'!\n";
    return 0;
}

Если вы хотите вернуть код символа нажатой клавиши и вывести символ, нажатый на консоль, тогда вы можете использовать getche_()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...