Любопытная проблема с консольным вводом в C # - PullRequest
0 голосов
/ 03 июля 2010

При использовании Console.Read () реализация, похоже, думает, что, как только вы нажмете ввод, вы ввели достаточное количество байтов для вечности чтения. Например, если чтение вызывается дважды подряд, вы не можете ввести одно значение в одной строке, нажать ввод и перейти к следующей. Даже если вы ввели только один символ, Read просто возвращает ноль (Правка: или один. Я не слишком уверен.). У меня тоже есть проблема с ReadLine. Я пытаюсь держать консоль открытой для ввода после завершения программы (у меня есть приложение WPF и я использовал AllocConsole вручную) и / или запрашивать у пользователя каждый отдельный фрагмент ввода. Но это не работает. Есть ли какая-нибудь кнопка, чтобы попросить ее заблокировать, если нет доступного ввода?

Я написал интерпретатор Brainfuck, и примеры программ из Wiki дают ожидаемый результат, если они не используют ввод.

Что я хочу сделать, это ввести один символ, нажать Enter, получить этот символ в виде символа, повторить.

1 Ответ

1 голос
/ 03 июля 2010

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

public static int ReadLastKey()
{
  int lastKey = -1;
  for(;;)
  {
    ConsoleKeyInfo ki = Console.ReadKey();
    if (ki.Key != ConsoleKey.Enter)
    {
      lastKey = (int)ki.KeyChar;          
    }
    else
    {
      return lastKey;
    }
  }       
}

Функция ReadLastKey считывает нажатия клавиш и возвращает последнюю нажатую клавишу при нажатии клавиши ввода.

Конечно, если вы не хотите, чтобы несколько нажатий клавиш записывались, вы можете удалить цикл и просто использовать Console.ReadKey дважды, один раз, чтобы получить нажатие клавиши, а затем второй раз, чтобы дождаться ввода.Или некоторая перестановка одного из них.

Вот простая версия функции, которая позволяет нажимать только одну клавишу, а затем ждать нажатия клавиши ввода.Обратите внимание, что это очень упрощенно, вы можете обрабатывать другие условия выхода и т. Д.

public static int ReadLastKey()
{
  int lastKey = -1;
  ConsoleKeyInfo ki;

  // Read initial key press
  ki = Console.ReadKey();

  // If it is enter then return -1
  if (ki.Key == ConsoleKey.Enter) return lastKey;

  lastKey = (int)ki.KeyChar;

  // Wait for the user to press enter before returning the last key presss,
  // and do not display key the errant key presses.
  do
  {
    ki = Console.ReadKey(true);
  } while (ki.Key != ConsoleKey.Enter);

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