Согласно документации MSDN, метод Console.Read
возвращает:
Следующий символ из входного потока или отрицательный (-1), если в данный момент больше нет символов для чтения.
Итак, на самом деле вы видите только первый символ, который в данный момент находится в потоке (то есть символы, полученные между двумя последними Enter pushes).
Во время вашего модульного тестирования казалось, что значения были сдвинуты на 48, потому что так получилось, что значения ASCII для символов от «0» до «9», как вы уже догадались, 48 для «0», 49 для «1» и т. Д .:
Поскольку вы не указали преобразование, содержимое потока «автоматически» считывалось как char
значения, а ваш вызов Read()
отображал их десятичные эквиваленты ASCII.
Вы можете проверить это с помощью этого простого теста:
static void TestRead()
{
int current = 0;
Console.Write("Enter 1: ");
current = Console.Read();
Console.WriteLine("Next char: {0}", current);
current = Console.Read();
Console.WriteLine("Next char: {0}", current);
current = Console.Read();
Console.WriteLine("Next char: {0}", current);
Console.Write("Enter 22: ");
current = Console.Read();
Console.WriteLine("Next char: {0}", current);
current = Console.Read();
Console.WriteLine("Next char: {0}", current);
current = Console.Read();
Console.WriteLine("Next char: {0}", current);
current = Console.Read();
Console.WriteLine("Next char: {0}", current);
}
Что приведет к:
Вы заметите, что параллельные вызовы Read()
захватывают один символ из потока и дают его десятичный эквивалент ASCII. Также обратите внимание на то, как Windows добавляет последовательность возврата каретки (ASCII 13) и перевода строки (ASCII 10) для каждого нажатия клавиши Enter , которое ваша программа точно возвращает вам.
Небольшая модификация этого метода тестирования поможет определить точку, в которой отсутствуют конкретные направления, среда выполнения будет интерпретировать содержимое вашего входного потока в виде символов:
static void TestReadModified()
{
int current = 0;
Console.Write("Enter a: ");
current = Console.Read();
Console.WriteLine("Next char: {0}", current);
current = Console.Read();
Console.WriteLine("Next char: {0}", current);
current = Console.Read();
Console.WriteLine("Next char: {0}", current);
}
Как и ожидалось, приведенный выше метод вернет значение ASCII для символа 'a':
Как уже упоминали другие, это легко исправить. Просто сообщите среде выполнения, что вы хотите, чтобы значение интерпретировалось как int
. Вероятно, это также хорошая идея, по крайней мере, проверить, что полученный вход является числом:
static void readPerson(out string name, out int age)
{
Console.Write("Enter name: ");
name = Console.ReadLine();
Console.Write("Enter age: ");
// in this case, we could simply use tempAge (defaults to 0)
// but it's just practice to check TryParse's success flag
int tempAge;
var success = Int32.TryParse(Console.ReadLine(), out tempAge);
age = success ? tempAge : 0;
Console.WriteLine("Name: {0}; Age: {1}", name, age);
Console.ReadLine();
}