чтение двух целых чисел в одной строке с использованием C # - PullRequest
28 голосов
/ 07 октября 2010

я знаю, как заставить консоль читать два целых числа, но каждое целое число само по себе похоже на это

int a = int.Parse(Console.ReadLine());
int b = int.Parse(Console.ReadLine());

если я ввел два числа, то есть (1 2), значение (1 2), не могуразбираться с целыми числами, что я хочу, если я ввел 1 2, то он будет принимать как два целых числа

Ответы [ 12 ]

26 голосов
/ 07 октября 2010

Один из вариантов - принять одну строку ввода в виде строки и затем обработать ее.Например:

//Read line, and split it by whitespace into an array of strings
string[] tokens = Console.ReadLine().Split();

//Parse element 0
int a = int.Parse(tokens[0]);

//Parse element 1
int b = int.Parse(tokens[1]);

Одна из проблем этого подхода заключается в том, что он потерпит неудачу (выбрасывая IndexOutOfRangeException / FormatException), если пользователь не введет текст в ожидаемом формате.Если это возможно, вам придется проверить ввод.

Например, с помощью регулярных выражений:

string line = Console.ReadLine();

// If the line consists of a sequence of digits, followed by whitespaces,
// followed by another sequence of digits (doesn't handle overflows)
if(new Regex(@"^\d+\s+\d+$").IsMatch(line))
{
   ...   // Valid: process input
}
else
{
   ...   // Invalid input
}

В качестве альтернативы:

  1. Убедитесь, что вводразбивается на точно 2 строки.
  2. Используйте int.TryParse - попытку для разбора строк на числа.
6 голосов
/ 07 октября 2010

Вам нужно что-то вроде (без кода проверки ошибок)

var ints = Console
            .ReadLine()
            .Split()
            .Select(int.Parse);

Это читает строку, разделяет пробел и анализирует разделенные строки как целые числа. Конечно, в действительности вы захотите проверить, действительно ли введенные строки являются действительными целыми числами (int.TryParse).

5 голосов
/ 07 октября 2010

Затем вы должны сначала сохранить его в строку, а затем разделить его, используя пробел в качестве токена.

3 голосов
/ 07 октября 2010

Считайте строку в строку, разбейте строку и затем проанализируйте элементы. Простая версия (к которой необходимо добавить проверку ошибок):

string s = Console.ReadLine();
string[] values = s.Split(' ');
int a = int.Parse(values[0]);
int b = int.Parse(values[1]);
2 голосов
/ 06 июня 2016
string[] values = Console.ReadLine().Split(' ');
int x = int.Parse(values[0]);
int y = int.Parse(values[1]);
1 голос
/ 09 апреля 2016
int a, b;
string line = Console.ReadLine();
string[] numbers= line.Split(' ');
a = int.Parse(numbers[0]);
b = int.Parse(numbers[1]);
1 голос
/ 05 февраля 2014
public static class ConsoleInput
{
    public static IEnumerable<int> ReadInts()
    {
        return SplitInput(Console.ReadLine()).Select(int.Parse);
    }

    private static IEnumerable<string> SplitInput(string input)
    {
        return Regex.Split(input, @"\s+")
                    .Where(x => !string.IsNullOrWhiteSpace(x));
    }
}
1 голос
/ 29 июня 2013
string x;
int m;
int n;

Console.WriteLine("Enter two no's seperated by space: ");

x = Console.ReadLine();
m = Convert.ToInt32(x.Split(' ')[0]);
n = Convert.ToInt32(x.Split(' ')[1]);

Console.WriteLine("" + m + " " + n);

Это должно работать в соответствии с вашими потребностями!

1 голос
/ 07 октября 2010

в 1 строке, благодаря LinQ и регулярному выражению (проверка не требуется)

var numbers = from Match number in new Regex(@"\d+").Matches(Console.ReadLine())
                    select int.Parse(number.Value);
0 голосов
/ 20 мая 2018

У меня есть намного более простое решение, я использую оператор switch и пишу сообщение для пользователя в каждом случае, используя Console.write (), начинающийся с ("\ n").

Вот пример заполнения массива циклом for при вводе пользовательского ввода.* Примечание: вам не нужно писать цикл for, чтобы это работало * Попробуйте этот пример с целочисленным массивом с именем arrayOfNumbers [] и временной переменной integer.Запустите этот код в отдельном консольном приложении и посмотрите, как можно вводить данные пользователя в одной строке!

           int temp=0;
           int[] arrayOfNumbers = new int[5];

        for (int i = 0; i < arrayOfNumbers.Length; i++)
            {
      switch (i + 1)
                {
                    case 1:
                        Console.Write("\nEnter First number: ");
                        //notice the "\n" at the start of the string        
                        break;
                    case 2:
                        Console.Write("\nEnter Second number: ");
                        break;
                    case 3:
                        Console.Write("\nEnter Third number: ");
                        break;
                    case 4:
                        Console.Write("\nEnter Fourth number: ");
                        break;
                    case 5:
                        Console.Write("\nEnter Fifth number: ");
                        break;


                    } // end of switch

                    temp = Int32.Parse(Console.ReadLine()); // convert 
                    arrayOfNumbers[i] = temp; // filling the array
                    }// end of for loop 

Волшебная хитрость в том, что вы обманываете консольное приложение, секрет в том, что вы вводите данные пользователя в той же строке, на которой пишете свое сообщение.(message => "Введите первое число:")

Это делает ввод данных пользователем похожим на вставку в той же строке.Я признаю, что это немного примитивно, но оно делает то, что вам нужно, не тратя время на сложный код для такой простой задачи.

...