为什么StringReader会读'\ uffff'?

时间:2015-11-22 00:56:14

标签: c# input console end-of-line

我正在写一种叫做SPL的语言。它有一个Input命令,用于读取ISplRuntime.Input属性的输入(它是TextReader)。所有其他命令都在这个界面上运行,因为这样我就可以用一个库编写不同的应用程序了!

然后我写了另一个控制台应用来测试我的语言。这是我ISplRuntime的实现。专注于Input和构造函数:

public class MyRuntime : ISplRuntime {
    protected TextReader reader;
    protected bool stopped;

    public object Current {
        get;
        set;
    }

    public virtual TextReader Input {
        get {
            return reader;
        }
    }

    public object[] Memory {
        get;
        protected set;
    }

    public TextWriter Output {
        get {
            return Console.Out;
        }
    }

    public bool Stopped {
        get {
            return stopped;
        }

        set {
            stopped = value;
            if (value) {
                Console.WriteLine ();
                Console.WriteLine ("Program has finished");
            }
        }
    }

    public void ShowErrorMessage (string error) {
        Console.WriteLine (error);
    }

    public MyRuntime () {
        string s = Console.ReadLine ();
        reader = new StringReader (s);
        stopped = false;
        Memory = new object[20];
    }
}

构造运行时时,它会要求输入。并使用该输入创建StringReader并将其返回Input属性。所以每次输入只有一个lline。

然后我在SPL中编写一个输出输入的程序。这就是问题所在!当我输入1 1 1 1时,它打印1 1 1并抛出FormatException。这就是我读取数字输入的方式:

private bool ReadFromInput (ISplRuntime runtime, out int i) {
    char stuffRead = (char)runtime.Input.Peek ();
    if (stuffRead == ' ') {
        i = 0;
        runtime.Input.Read ();
        return true;
    }

    if (char.IsNumber (stuffRead)) {
        string numberString = "";
        while (char.IsNumber (stuffRead)) {
            stuffRead = (char)runtime.Input.Read ();
            numberString += stuffRead;
        }

        i = Convert.ToInt32 (numberString); //This is where the exception occured! (Obviously, because there is no other methods that would throw it)
        return true;
    } else {
        i = 0;
        return false;
    }
}

参数runtime只是您刚才看到的运行时。如果成功读取数字,则返回true。该数字是输出参数i

在Visual Studio中使用“Watch”窗口后,我发现抛出异常时数字字符串为"1\uffff"。这就是它抛出它的原因!我知道(认为)'\uffff'是行尾字符。但为什么它会出现在我的输入中呢?我知道(想)按Ctrl + Z会结束,但我没有!然后我在观察窗口中检查了runtime.Input。这是结果:

enter image description here

我看到有一个名为_s的字段,我认为这是我告诉它读取的字符串。看到? _s甚至不包含'\uffff',它怎么读?

P.S。我已经知道了解决方案。我只需稍微更改while循环即可。但我想知道为什么它会读取行尾。

1 个答案:

答案 0 :(得分:3)

此处没有任何谜题 - .nextInt(4)由您的代码生成。您所需要的只是阅读文档并了解您调用的方法返回。

TextReader.Peek Method

  

返回值
  类型:System.Int32
  表示要读取的下一个字符的整数,如果没有更多字符可用或读者不支持搜索,则为 -1

TextReader.Read Method

  

返回值
  类型:System.Int32
  文本阅读器中的下一个字符,如果没有其他字符可用,则 -1

希望您看到\uffff-1)和0xffffffff之间的关系。