Java 如何正确编写一个C#helper类来从一行中读取多个整数?
我正在尝试从Java转换到C,同时也在练习竞争性编程问题,但我发现C没有一种方便的方式从控制台读取单个int,比如Java 如何正确编写一个C#helper类来从一行中读取多个整数?,java,c#,Java,C#,我正在尝试从Java转换到C,同时也在练习竞争性编程问题,但我发现C没有一种方便的方式从控制台读取单个int,比如Scanner.nextInt()。公平地说,我在Java中也没有使用这种方法,而是使用了一个帮助器类,它可以执行以下操作: internal static class InputHelper { private static int current; private static string[] buffer; public static string
Scanner.nextInt()
。公平地说,我在Java中也没有使用这种方法,而是使用了一个帮助器类,它可以执行以下操作:
internal static class InputHelper
{
private static int current;
private static string[] buffer;
public static string next()
{
while (buffer == null || current == buffer.Length)
{
current = 0;
buffer = Console.ReadLine()?.Split();
}
return buffer[current++];
}
public static int NextInt()
{
return int.Parse(next());
}
}
(这是一个静态内部类):
我试着用C#改写同样的内容,结果是这样的:
internal static class InputHelper
{
private static int current;
private static string[] buffer;
public static string next()
{
while (buffer == null || current == buffer.Length)
{
current = 0;
buffer = Console.ReadLine()?.Split();
}
return buffer[current++];
}
public static int NextInt()
{
return int.Parse(next());
}
}
但是,当我从问题语句粘贴此序列时,我得到了一个异常(NumberFormatException):
编辑:我怀疑它抛出了一个异常,因为在windows linux上使用了不同的换行符,但这可能是完全错误的
以及其他时间,例如:
var n = InputHelper.NextInt();
while (n > 0)
{
n--;
Console.WriteLine(InputHelper.NextInt());
}
它很好用。你知道为什么会出错吗?我不知道为什么你的不起作用,但你可以试试这个:
public static class ConsoleHelper
{
private static string[] input = new string[0];
private static int inputIndex;
public static void ReadNextInput()
{
input = Console.ReadLine().Split();
inputIndex = 0;
}
public static int GetNextInt()
{
return int.Parse(ReadNextWord());
}
public static string GetNextWord()
{
return ReadNextWord();
}
private static string ReadNextWord()
{
if (inputIndex >= input.Length)
{
ReadNextInput();
}
return input[inputIndex++];
}
}
我一直在比赛中使用它,到现在为止,从未让我失望过
编辑:
您可以尝试此拆分:split(“”,StringSplitOptions.RemoveEmptyEntries)代码>
这会自动删除输出数组中的空元素
然而,当我从一个问题语句粘贴这个序列时,我得到了一个异常(NumberFormatException)
我怀疑这是因为输入上有尾随空格。默认情况下,Split
遇到后面没有非分隔符的分隔符时,将发出一个空条目
例如,给定输入12
(带有两个空格),结果将是[“1”、“”、“2”]
,因为第一个空格后面跟着另一个分隔符。类似地,输入12
(带尾随空格)将产生[“1”、“2”、“2”]
,因为最后的分隔符右侧没有任何内容
这通常是一个混淆点,Split
的文档没有很好地通知您:
返回:一个数组,其元素包含此实例中由分隔符中的一个或多个字符分隔的子字符串。[我的重点]
对我来说,这句话意味着相邻的分隔符将被“展平”为一个,但它根本不是这样工作的
若要避免此行为,请使用接受StringSplitOptions
的StringSplitOptions.removemptyEntriesSplit(“”,StringSplitOptions.removemptyEntries)的重载String.Split
代码>完成了任务!谢谢!NumberFormatException是一个java异常,您引用哪个代码?
public static class ConsoleHelper
{
private static string[] input = new string[0];
private static int inputIndex;
public static void ReadNextInput()
{
input = Console.ReadLine().Split();
inputIndex = 0;
}
public static int GetNextInt()
{
return int.Parse(ReadNextWord());
}
public static string GetNextWord()
{
return ReadNextWord();
}
private static string ReadNextWord()
{
if (inputIndex >= input.Length)
{
ReadNextInput();
}
return input[inputIndex++];
}
}