Зачем получать нулевое значение из консоли в C# для readLine() после использования read()

У меня есть следующий код

char c1 = (char)Console.Read();
Console.WriteLine("Enter a string.");
string instr = Console.ReadLine();

Требуется значение для c1после этого он печатает "Введите строку". Однако, когда я пытаюсь ввести строку, кажется, работает ReadKey()Это означает, что как только я нажимаю любую клавишу, это показывает, что instr имеет нулевое значение.

Если я уберу первую строку (char c1 = (char)Console.Read();), программа работает правильно.

Почему это?

1 ответ

Решение

Когда вы звоните Read(), он по-прежнему блокируется до тех пор, пока вы не нажмете Enter, хотя реальный метод будет использовать только один символ из входного потока. Когда вы впоследствии нажимаете Enter, символ действительно читается, а перевод строки - нет. Поскольку символ новой строки все еще находится во входном потоке, вызов ReadLine() немедленно возвращается, так как он читает терминатор строки. Вы можете увидеть это поведение более подробно, если бы вам пришлось отлаживать.

Чтобы решить эту проблему, я мог бы предложить следующее, используя ReadKey():

char c1 = Console.ReadKey().KeyChar;
Console.WriteLine(Environment.NewLine /* Added simply for readability */
    + "Enter a string.");
string instr = Console.ReadLine();

Если вы хотите, чтобы пользователь продолжал нажимать, введите после Read() Просто используйте ReadLine и взять подстроку для первого символа.

Другие вопросы по тегам