Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何正确编写一个C#helper类来从一行中读取多个整数?_Java_C# - Fatal编程技术网

Java 如何正确编写一个C#helper类来从一行中读取多个整数?

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

我正在尝试从Java转换到C,同时也在练习竞争性编程问题,但我发现C没有一种方便的方式从控制台读取单个int,比如
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.removemptyEntries

Split(“”,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++];
    }
}