Вопрос по c#, console-application, .net – Проблемы Console.Read () и Console.ReadLine ()

4

Я пытался использовать Console.Read () и Console.ReadLine () в C #, но получаю странные результаты. например этот код

Console.WriteLine("How many students would you like to enter?");
int amount = Console.Read();
Console.WriteLine("{0} {1}", "amount equals", amount);

for (int i=0; i < amount; i++)
{
     Console.WriteLine("Input the name of a student");
     String StudentName = Console.ReadLine();
     Console.WriteLine("the Students name is " + StudentName);
}

дал мне эту сумму = 49, когда я ввел 1 для количества студентов, и у меня даже не было возможности ввести имя студента.

Посмотрите 49 в таблице ASCII :)asciitable.com asawyer

Ваш Ответ

10   ответов
0

Console.Read() возвращает код символа введенного вами символа. Вам нужно использоватьConvert.ToChar(amount); чтобы получить символ в виде строки, а затем вам нужно будет сделатьint.Parse() чтобы получить значение, которое вы ищете.

2

static void Main(string[] args)
{
     Console.WriteLine("How many students would you like to enter?");
     var amount = Convert.ToInt32(Console.ReadLine());

     Console.WriteLine("{0} {1}", "amount equals", amount);

     for (int i = 0; i < amt; i++)
     {
         Console.WriteLine("Input the name of a student");
         String StudentName = Console.ReadLine();
         Console.WriteLine("the Students name is " + StudentName);
     }
}
0
Console.WriteLine("How many students would you like to enter?");
string amount = Console.ReadLine();
int amt = Convert.ToInt32(amount);

Console.WriteLine("{0} {1}", "amount equals", amount);

for (int i = 0; i < amt; i++)
{
    Console.WriteLine("Input the name of a student");
    String StudentName = Console.ReadLine();
    Console.WriteLine("the Students name is " + StudentName);
}
//thats it
0

Вместо:

int amount = Console.Read();

пытаться:

int amount = 0;
int.TryParse(Console.ReadLine(), out amount);

Это потому, что вы читаете только символьный код, например, набрав 11, вы все равно получите 49. Вам нужно прочитать строковое значение и проанализировать его как значение int. С кодом выше в случае неправильного ввода вы получите 0.

0

TL;DR; Enter ключ в Windows не является одним символом. Этот факт лежит в основе многих проблем, связанных сConsole.Read() метод.

Complete Details: If you run below piece of code on your computer then you can solve lot of mysteries behind Console.Read():

static void Main(string[] args)
{
    var c = Console.Read();
    Console.WriteLine(c);
    c = Console.Read();
    Console.WriteLine(c);
}

Во время работы программы нажмитеEnter нажмите один раз на клавиатуре и проверьте вывод на консоли. Вот как это выглядит:

enter image description here

Интересно ты нажалEnter ключ только один раз, но он смог угодить двумRead() звонки в моем фрагменте кода.Enter ключ в окнах испускает два символа для символа новой строки, а именно возврат каретки (\r - код ASCII 13) и перевод строки (\n - код ASCII 10). Вы можете прочитать об этом больше здесь в этом посте -Возврат каретки Windows \ r \ n состоит из двух или одного символа?

2

вы получаете характерchar из прочитанного не int. сначала вам нужно будет сделать это строкой и проанализировать ее как строку. Реализация может выглядеть следующим образом

    Console.WriteLine("How many students would you like to enter?");
    var read = Console.ReadLine();
    int amount;
    if(int.TryParse(read,out amount)) {
      Console.WriteLine("{0} {1}", "amount equals", amount);

      for (int i=0; i < amount; i++)
      {
        Console.WriteLine("Input the name of a student");
        String StudentName = Console.ReadLine();
        Console.WriteLine("the Students name is " + StudentName);
      }
    }

Я изменил его на использование readline, потому что readline возвращает строку, которая произвольно не ограничивает число студентов до 9 (максимальное число с одной цифрой)

Спасибо всем за помощь, программа, кажется, работает нормально Mike Cornell
2

Попробуйте изменить свой код таким образом

int amount;
while(true)
{
    Console.WriteLine("How many students would you like to enter?"); 
    string number = Console.ReadLine(); 
    if(Int32.TryParse(number, out amount))
        break;
}
Console.WriteLine("{0} {1}", "amount equals", amount); 
for (int i=0; i < amount; i++) 
{ 
    Console.WriteLine("Input the name of a student"); 
    String StudentName = Console.ReadLine(); 
    Console.WriteLine("the Students name is " + StudentName); 
} 

Вместо того, чтобы использоватьRead использованиеReadLine а затем проверьте, является ли пользовательский ввод действительно целым числом, используяInt32.TryParse, Если пользователь не ввел правильное число, повторите вопрос.
С помощьюConsole.Read ограничит ваш ввод одним символом, который необходимо преобразовать и проверить, чтобы он был действительным числом.

Конечно, это жестокий пример без какой-либо проверки ошибок или какого-либо безопасного сброса из циклов.

@Servy Или он просто не мог понять, как работает Рид.
Что если он хочет, чтобы пользователь мог вводить только один символ, а не вводить всю строку?
Кажется, он старался не использоватьReadLine, который будет означать, что он хочет только одну цифру.
Но это ограничит число студентов до 9. И нигде я не читал об этом требовании.
@ Trisped Ну, ясно, что он не знает, какRead работает. Это больше вопрос "Как насчетRead он неправильно понял? & quot;
8

Это потому что ты читаешь чарса. Используйте соответствующие методы, такие какReadInt32() это заботится о правильном преобразовании прочитанного символа в желаемый вами тип.

Причина, по которой вы получаете49 потому что это код символа '1'; символ иnot это целочисленное представление.

char     code
0 :      48
1 :      49
2:       50
...
9:       57

например:ReadInt32() может выглядеть так:

public static int ReadInt32(string value){
      int val = -1;
      if(!int.TryParse(value, out val))
          return -1;
      return val;
}

и используйте это как:

int val = ReadInt32(Console.ReadLine());

Было бы очень хорошо иметь возможность создатьextension methodно, к сожалению, невозможно создать метод расширения для статического типа иПриставка этоstatic тип.

ReadInt32 на консоли?
int.TryParse достаточно просто и элементы вашегоReadInt32 Метод повторно используется в вызывающем методе, поэтому вам лучше использовать решение, представленное Rune FS или Steve.
@Trisped: если во время выполнения программы мне нужно прочитать несколько разinteger из консоли, я бы предпочел иметь его внутри одного метода, и вызватьmethodСкорее тогда спагетти-код везде.
Если вы напишите весь блок кода, используя свой метод, вы обнаружите, что используете то же количество переменных и вызовов методов (поскольку вам нужно проверить ввод), как если бы вы только что использовалиint.TryParse метод. Если бы было что-то большее, чем просто преобразовать строку в int, я бы согласился, так как легче / безопаснее иметь код в одном методе, а не распределять его по всем местам, где он используется.
0

Попробуй это:

int amount = ReadInt32();

или, если это не работает, попробуйте это:

int amount = Console.ReadInt32();

или это:

int amount = Convert.ToInt32(Console.Readline());

В этом случае он будет читать строку, а затем преобразует ее в значение Int32.

Вы также можете пойти сюда:http://www.java2s.com/Tutorials/CSharp/System.IO/BinaryReader/C_BinaryReader_ReadInt32.htm

Если ничего не работает, пожалуйста, дайте мне знать.

0

Console.Read возвращает значение asci нажатой клавиши.

Если вы используетеConsole.ReadKey().KeyChar вы получитеchar это представляет фактический символ, который был нажат.

Затем вы можете превратить этот символ в односимвольную строку, используя.ToString().

Теперь, когда у вас есть строка, вы можете использоватьint.Parse или жеint.TryParse превратить строку, содержащую полностью числовые символы, в целое число.

Итак, все вместе:

int value;
if (int.TryParse(Console.ReadKey().KeyChar.ToString(), out value))
{
    //use `value` here
}
else
{
    //they entered a non-numeric key
}

Похожие вопросы