web-dev-qa-db-ja.com

C#を使用して1行で2つの整数を読み取る

私はコンソールに2つの整数を読み込ませる方法を知っていますが、各整数はこのように自己

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

私が2つの数字、つまり(1 2)、値(1 2)を入力した場合、1 2を入力した場合、必要な整数に解析することはできません

28
Nadeem

1つのオプションは、1行の入力を文字列として受け入れて処理することです。例えば:

//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]);

このアプローチの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. 入力がexactly 2文字列に分割されることを確認します。
  2. 使用する int.TryParse to attempt文字列を数値に解析します。
26
Ani

次のようなものが必要です(エラーチェックコードなし)

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

これは、行を読み取り、空白で分割し、分割された文字列を整数として解析します。もちろん、実際には、入力した文字列が実際に有効な整数(int.TryParse)であるかどうかを確認する必要があります。

6
Frank

次に、最初に文字列に保存し、スペースをトークンとして使用して分割する必要があります。

5
RvdK

行を文字列に読み取り、文字列を分割してから、要素を解析します。単純なバージョン(エラーチェックを追加する必要がある)は次のようになります。

string s = Console.ReadLine();
string[] values = s.Split(' ');
int a = int.Parse(values[0]);
int b = int.Parse(values[1]);
3
Dan Puzey
string[] values = Console.ReadLine().Split(' ');
int x = int.Parse(values[0]);
int y = int.Parse(values[1]);
2
gusto

linQと正規表現のおかげで1行で(型チェック不要)

var numbers = from Match number in new Regex(@"\d+").Matches(Console.ReadLine())
                    select int.Parse(number.Value);
1
iChaib
int a, b;
string line = Console.ReadLine();
string[] numbers= line.Split(' ');
a = int.Parse(numbers[0]);
b = int.Parse(numbers[1]);
1
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
Raz Megrelidze
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
Nishant

これを試して:

string numbers= Console.ReadLine();

string[] myNumbers = numbers.Split(' ');

int[] myInts = new int[myNumbers.Length];

for (int i = 0; i<myInts.Length; i++)
{
    string myString=myNumbers[i].Trim();
    myInts[i] = int.Parse(myString);
}

それが役に立てば幸い:)

0
Association
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SortInSubSet
{
    class Program
    {

        static int N, K;
        static Dictionary<int, int> dicElements = new Dictionary<int, int>();
        static void Main(string[] args)
        {

            while (!ReadNK())
            {
                Console.WriteLine("***************** PLEASE RETRY*********************");
            }

            var sortedDict = from entry in dicElements orderby entry.Key/3 , entry.Value ascending select entry.Value;

            foreach (int ele in sortedDict)
            {
                Console.Write(ele.ToString() + "  ");
            }

            Console.ReadKey();
        }

        static bool ReadNK()
        {
            dicElements = new Dictionary<int, int>();
            Console.WriteLine("Please entere the No. of element 'N' ( Between 2 and 9999) and Subset Size 'K' Separated by space.");

            string[] NK = Console.ReadLine().Split();

            if (NK.Length != 2)
            {
                Console.WriteLine("Please enter N and K values correctly.");
                return false;
            }

            if (int.TryParse(NK[0], out N))
            {
                if (N < 2 || N > 9999)
                {
                    Console.WriteLine("Value of 'N' Should be Between 2 and 9999.");
                    return false;
                }
            }
            else
            {
                Console.WriteLine("Invalid number: Value of 'N' Should be greater than 1 and lessthan 10000.");
                return false;
            }

            if (int.TryParse(NK[1], out K))
            {
                Console.WriteLine("Enter all elements Separated by space.");
                string[] kElements = Console.ReadLine().Split();

                for (int i = 0; i < kElements.Length; i++)
                {
                    int ele;

                    if (int.TryParse(kElements[i], out ele))
                    {
                        if (ele < -99999 || ele > 99999)
                        {
                            Console.WriteLine("Invalid Range( " + kElements[i] + "): Element value should be Between -99999 and 99999.");
                            return false;
                        }

                        dicElements.Add(i, ele);
                    }
                    else
                    {
                        Console.WriteLine("Invalid number( " + kElements[i] + "): Element value should be Between -99999 and 99999.");
                        return false;
                    }

                }

            }
            else
            {
                Console.WriteLine(" Invalid number ,Value of 'K'.");
                return false;
            }


            return true;
        }
    }
}

もっと簡単な解決策があり、switchステートメントを使用し、それぞれの場合に( "\ n")で始まるConsole.write()を使用してユーザーにメッセージを書き込みます。

ユーザー入力を取得しながらforループで配列を埋める例を次に示します。 *注:これを機能させるためにforループを記述する必要はありません* arrayOfNumbers []と呼ばれる整数配列と一時整数変数を使用してこの例を試してください。このコードを別のコンソールアプリケーションで実行し、同じ行でユーザー入力をどのように取得できるかを確認してください。

           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 

ここでの秘trickは、コンソールアプリケーションをだましていることです。秘密は、プロンプトメッセージを書いているのと同じ行でユーザー入力を取得していることです。 (メッセージ=> "最初の番号を入力:")

これにより、ユーザー入力が同じ行に挿入されているように見えます。私はそれが少し原始的であることを認めますが、それはそのような単純なタスクのために複雑なコードであなたの時間を無駄にすることなくあなたが必要なことをします。

0
Coder992