With comments
namespace Utils.Scanner
{
using System;
using System.Text;
using System.Globalization;
/// <summary>
/// Console input helper for C# and .NET. Allows simplified reading of numbers and string
/// tokens from the console in a way similar to "cin" in C++ and java.util.Scanner in Java.
/// </summary>
///
/// <copyright>
/// (c) Svetlin Nakov, 2011 - https://nakov.com
/// </copyright>
///
/// <example>
/// // In C++ we will use "cin >> x >> y;"
/// // Using Nakov.IO.Cin we can do the same as follows:
/// int x = Cin.NextInt();
/// double y = Cin.NextDouble();
/// </example>
///
public static class Cin
{
/// <summary>
/// Reads a string token from the console
/// skipping any leading and trailing whitespace.
/// </summary>
public static string NextToken()
{
StringBuilder tokenChars = new StringBuilder();
bool tokenFinished = false;
bool skipWhiteSpaceMode = true;
while (!tokenFinished)
{
int nextChar = Console.Read();
if (nextChar == -1)
{
// End of stream reached
tokenFinished = true;
}
else
{
char ch = (char)nextChar;
if (char.IsWhiteSpace(ch))
{
// Whitespace reached (' ', '\r', '\n', '\t') -->
// skip it if it is a leading whitespace
// or stop reading anymore if it is trailing
if (!skipWhiteSpaceMode)
{
tokenFinished = true;
if (ch == '\r' && (Environment.NewLine == "\r\n"))
{
// Reached '\r' in Windows --> skip the next '\n'
Console.Read();
}
}
}
else
{
// Character reached --> append it to the output
skipWhiteSpaceMode = false;
tokenChars.Append(ch);
}
}
}
string token = tokenChars.ToString();
return token;
}
/// <summary>
/// Reads an integer number from the console
/// skipping any leading and trailing whitespace.
/// </summary>
public static int NextInt()
{
string token = Cin.NextToken();
return int.Parse(token);
}
/// <summary>
/// Reads a floating-point number from the console
/// skipping any leading and trailing whitespace.
/// </summary>
/// <param name="acceptAnyDecimalSeparator">
/// Specifies whether to accept any decimal separator
/// ("." and ",") or the system's default separator only.
/// </param>
public static double NextDouble(bool acceptAnyDecimalSeparator = true)
{
string token = Cin.NextToken();
if (acceptAnyDecimalSeparator)
{
token = token.Replace(',', '.');
double result = double.Parse(token, CultureInfo.InvariantCulture);
return result;
}
else
{
double result = double.Parse(token);
return result;
}
}
/// <summary>
/// Reads a decimal number from the console
/// skipping any leading and trailing whitespace.
/// </summary>
/// <param name="acceptAnyDecimalSeparator">
/// Specifies whether to accept any decimal separator
/// ("." and ",") or the system's default separator only.
/// </param>
public static decimal NextDecimal(bool acceptAnyDecimalSeparator = true)
{
string token = Cin.NextToken();
if (acceptAnyDecimalSeparator)
{
token = token.Replace(',', '.');
decimal result = decimal.Parse(token, CultureInfo.InvariantCulture);
return result;
}
else
{
decimal result = decimal.Parse(token);
return result;
}
}
}
}
Without comments
namespace Utils.Scanner
{
using System;
using System.Text;
using System.Globalization;
public static class Cin
{
public static string NextToken()
{
StringBuilder tokenChars = new StringBuilder();
bool tokenFinished = false;
bool skipWhiteSpaceMode = true;
while (!tokenFinished)
{
int nextChar = Console.Read();
if (nextChar == -1)
{
// End of stream reached
tokenFinished = true;
}
else
{
char ch = (char)nextChar;
if (char.IsWhiteSpace(ch))
{
if (!skipWhiteSpaceMode)
{
tokenFinished = true;
if (ch == '\r' && (Environment.NewLine == "\r\n"))
{
Console.Read();
}
}
}
else
{
skipWhiteSpaceMode = false;
tokenChars.Append(ch);
}
}
}
string token = tokenChars.ToString();
return token;
}
public static int NextInt()
{
string token = Cin.NextToken();
return int.Parse(token);
}
public static double NextDouble(bool acceptAnyDecimalSeparator = true)
{
string token = Cin.NextToken();
if (acceptAnyDecimalSeparator)
{
token = token.Replace(',', '.');
double result = double.Parse(token, CultureInfo.InvariantCulture);
return result;
}
else
{
double result = double.Parse(token);
return result;
}
}
public static decimal NextDecimal(bool acceptAnyDecimalSeparator = true)
{
string token = Cin.NextToken();
if (acceptAnyDecimalSeparator)
{
token = token.Replace(',', '.');
decimal result = decimal.Parse(token, CultureInfo.InvariantCulture);
return result;
}
else
{
decimal result = decimal.Parse(token);
return result;
}
}
}
}
static void Main()
{
Console.Write("Enter your name: ");
string name = Console.ReadLine();
Console.Write("Enter two integers x and y separated by whitespace: ");
// cin >> x >> y;
int x = Cin.NextInt();
double y = Cin.NextDouble();
Console.Write("Enter your age: ");
int age = int.Parse(Console.ReadLine());
Console.WriteLine("Name: {0}, Age: {1}", name, age);
Console.WriteLine("x={0}, y={1}", x, y);
Console.Write("Enter a positive integer number N: ");
int n = Cin.NextInt();
Console.Write("Enter N decimal numbers separated by a space: ");
decimal[] numbers = new decimal[n];
for (int i = 0; i < n; i++)
{
numbers[i] = Cin.NextDecimal();
}
Console.Write("The numbers in ascending order: ");
Array.Sort(numbers);
for (int i = 0; i < n; i++)
{
Console.Write(numbers[i]);
Console.Write(' ');
}
Console.WriteLine();
Console.WriteLine("Enter two strings seperated by a space: ");
string firstStr = Cin.NextToken();
string secondStr = Cin.NextToken();
Console.WriteLine("First str={0}", firstStr);
Console.WriteLine("Second str={0}", secondStr);
}
static void Main()
{
int n;
n = Cin.NextInt();
int[] numbers = new int[n];
for (int i = 0; i < n; i++)
{
numbers[i] = Cin.NextInt();
}
for (int i = 0; i < n; i++)
{
Console.Write(numbers[i] + " ");
}
}