Можно ли использовать переменную в качестве порядкового номера в C#? - PullRequest
0 голосов
/ 02 августа 2020

Я все еще изучаю C#, но название в основном подводит итог. Я пытался создать систему, в которой пользователь вводил бы число от 0 до 6, а программа возвращала бы соответствующий день недели. Я создал массив строк со всеми днями в них и попытался выполнить индексацию непосредственно из пользовательского ввода (после преобразования в int).

string[] days = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};

Console.Write("Day number: ");
int num = Convert.ToInt32(Console.Read());
Console.WriteLine(days[num]);

Console.ReadLine();

Как только я ввожу число в консоль, System .IndexOutOfRangeException появляется, но программа не завершается. Я не знаю, где-то в коде что-то не так, или просто эти переменные нельзя использовать в качестве порядкового номера.

Ответы [ 4 ]

3 голосов
/ 02 августа 2020

Из MSDN:

Console.Read(): считывает следующий символ из стандартного входного потока.

Когда вы вводите любое числовое значение c в консоль, Console.Read() преобразуется в его значение в Юникоде.

Предположим, вы ввели 1 в консоль,

int num = Convert.ToInt32(Console.Read());
           //  +               + This converts '1' to its unicode value i.e "49" 
           //  + This will convert "49" to its integer value i.e 49

Теперь ваш num содержит 49 вместо 1, и когда вы пытаетесь получить доступ к элементу массива с num в качестве индекса, он ищет 49 вместо 1. Здесь вы получаете System.IndexOutOfRangeException ошибку

    int num = Convert.ToInt32(Console.Read());  //You entered 1, but 49 get stored in num
    Console.WriteLine(days[num]); //days[num] = days[49] (IndexOutOfRangeException)

Чтобы исправить эту проблему, используйте Console.ReadLine() или преобразуйте значение Unicode в его исходное значение

Используя Console.ReadLine():

...
int num = Convert.ToInt32(Console.ReadLine());
Console.WriteLine(days[num]);
...

Альтернативный способ,

...
int num = Console.Read() - '0';
Console.WriteLine(days[num]);
...
0 голосов
/ 02 августа 2020

Что происходит, так это то, что ваш Console.Read уже возвращает int, в частности, код символа ASCII набранного вами символа. Поскольку код символа ASCII '0' равен 48, ваш диапазон значений не 0 - 6, как вы ожидаете, а 48 - 54. Также следует отметить, что, поскольку мы уже получили int, мы можем удалить Convert.ToInt32, и мы можем просто взять код символа, который мы читаем, и вычесть значение 0:

int num = Console.Read() - '0';
0 голосов
/ 02 августа 2020

вам нужно заменить Read () на ReadLine ()

string[] days = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};

Console.Write("Day number: ");
int num = Convert.ToInt32(Console.ReadLine());
Console.WriteLine(days[num]);

Console.ReadLine();
0 голосов
/ 02 августа 2020

Для краткости: просто замените Console.Read() на Console.ReadLine()

Console.Write("Day number: ");
Console.WriteLine(Console.ReadLine());

Для объяснения: Read() будет читать следующий character из стандартного входного потока. Затем верните int символа. Итак, почему, когда вы даете '0', он вернет 48, который представляет '0' в ASCII Table

enter image description here

enter image description here

Whereas ReadLine() will read it as string value. From this result we are easy to convert by using Convert.ToInt32()

введите описание изображения здесь

Вопрос в том, можно ли использовать только Read()?

Да. Мы вычитаем входное число до 48 (или '0'), тогда мы можем получить точно. Но будет ограничено, что принимаются только диапазоны 0-9. Таким образом, лучше всего использовать ReadLine ().

Console.Write("Day number: ");
Console.WriteLine(Console.Read() - '0'); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...