Вопрос по .net, console-application, c# – Проблемы 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

Вместо:

int amount = Console.Read();

пытаться:

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

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

0

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

Полная информация: Если вы запустите ниже кусок кода на вашем компьютере, то вы можете решить множество загадок:Console.Read()

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

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

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

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);
     }
}
8

такие какReadInt32() это заботится о правильном преобразовании прочитанного символа в желаемый вами тип.

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

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 на консоли? Rune FS
int.TryParse достаточно просто и элементы вашегоReadInt32 Метод повторно используется в вызывающем методе, поэтому вам лучше использовать решение, представленное Rune FS или Steve. Trisped
@Trisped: если во время выполнения программы мне нужно прочитать несколько разinteger из консоли, я бы предпочел иметь его внутри одного метода, и вызватьметодСкорее тогда спагетти-код везде. Tigran
Если вы напишите весь блок кода, используя свой метод, вы обнаружите, что используете то же количество переменных и вызовов методов (поскольку вам нужно проверить ввод), как если бы вы только что использовалиint.TryParse метод. Если бы было что-то большее, чем просто преобразовать строку в int, я бы согласился, так как легче / безопаснее иметь код в одном методе, а не распределять его по всем местам, где он используется. Trisped
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 возвращает строку, которая неt произвольно ограничивает количество студентов до 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
Но это ограничит число студентов до 9. И нигде я не читал об этом требовании. Steve
@ Trisped Ну, этоясно, что он нене знаю какRead работает. Это'больше вопрос "Как насчетRead он неправильно понял? Servy
@Servy Или он просто не мог понять, как работает Рид. Trisped
Кажется, он старался не использоватьReadLine, который будет означать, что он хочет только одну цифру. Servy
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
}
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 = 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() возвращает код символа введенного вами символа. Вам нужно использоватьConvert.ToChar(amount); чтобы получить символ в виде строки, а затем вам нужно будет сделатьint.Parse() чтобы получить значение, которое выищу.

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