Считывание числа с консоли
Я cчитываю числа через Read и ReadLine. Возможно я не совсем корректно составил функцию ReadToInt().
Возникает такая ошибка:
using System;
namespace visibility
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Read\n"+ReadToInt());
Console.WriteLine("ReadLine\n"+ReadLineToInt());
}
static int ReadLineToInt()
{
string str;
str=Console.ReadLine();
return Int32.Parse(str);
}
static int ReadToInt()
{
char ch;
int x;
int i = 0;
string str="";
do
{
x = Console.Read();
ch = Convert.ToChar(x);
str += ch;
i++;
}
while (x != 13);
return Int32.Parse(str);
}
}
}
Ответы (3 шт):
Может так ?
static int ReadLineToInt()
{
return int.Parse(Console.ReadLine());
}
Переписал функцию ReadToInt(), таким образом, обошел ошибку.
static int ReadToInt()
{
char ch;
int x;
int i = 0;
string str="";
do
{
x = Console.Read();
ch = Convert.ToChar(x);
if (x != 10 && x != 13) str += ch; // добавил проверку
i++;
}
while (x != 10); // выхожу из цикла когда все закончилис все символы в буфере
return Int32.Parse(str);
}
Не уверен, что так правильно?..
Не используйте Console.Read(), это низкоуровневое чтение. Чтобы его использовать, надо знать много нюансов кодирования управляющих последовательностей и символов. Ну например клавиша Enter - это не 10 и не 13, а последовательность 2 символов с кодами 10 и 13 (CR+LF). То есть прочитав 10, нужно тут же выполнить чтение следующего символа, и если там 13, то это Enter. Ничего подобного в вашем коде я не нашел. Поэтому для посимвольного ввода, если очень хочется, используйте более высокоуровневый метод Console.ReadKey(). Пример с ним в самом низу ответа, а пока давайте без посимвольного попробуем.
Если надо вводить до тех пор, пока ввод не будет корректным, то безотказный ввод числа может выглядеть так:
static int ReadInt32(string prompt)
{
Console.Write(prompt);
return int.Parse(Console.ReadLine());
}
А использовать его так:
int result;
while (true)
{
try
{
result = ReadInt32("Введите число: ");
break;
}
catch (FormatException ex)
{
Console.WriteLine($"Некорректный ввод: {ex.Message}");
}
}
Или еще можно так без обработки исключений:
static bool TryReadInt32(string prompt, out int result)
{
Console.Write(prompt);
return int.TryParse(Console.ReadLine(), out result);
}
А использовать его так:
int result;
while (true)
{
if (TryReadInt32("Введите число: ", out result))
break;
Console.WriteLine($"Некорректный ввод числа, попробуйте еще раз");
}
И совсем альтернативный способ, который будет позволять вводить только цифры. Это к вопросу, как полностью управлять посимвольным вводом.
Данный метод поддерживает только цифры, то есть ввод только неотрицательных чисел, но для учебного примера сойдёт.
static int ReadIn32(string prompt)
{
Console.Write(prompt);
string number = string.Empty;
ConsoleKey key;
do
{
ConsoleKeyInfo keyInfo = Console.ReadKey(true);
key = keyInfo.Key;
if (key == ConsoleKey.Backspace && number.Length > 0)
{
Console.Write("\b \b"); // затирание последнего символа Backspace+пробел+Backspace
number = number[0..^1]; // удаление последнего символа из строки
}
else if (keyInfo.KeyChar >= '0' && keyInfo.KeyChar <= '9')
{
Console.Write(keyInfo.KeyChar);
number += keyInfo.KeyChar;
}
} while (key != ConsoleKey.Enter);
if (number.Length == 0) // пользователь ничего не ввёл
{
number = "0";
Console.Write(number);
}
Console.WriteLine();
return int.Parse(number);
}
Здесь ещё нет защиты от переполнения, то есть если пользователь введёт очень большое число, которое не влезет в Int32, то будет исключение. Я не стал добавлять проверку, чтобы не усложнять и без того не простой код.
