簡體   English   中英

InputStreamReader .read() 不讀取/跳過第一個字符?

[英]InputStreamReader .read() doesn't read / skips the first character?

我正在嘗試編寫一個簡單的復數計算器,它可以計算以下表達式:

  • 輸入1:(10+30i)+(90+20i)
  • 預期輸出:(100+50i)
  • 輸入2:(10+30i)-(90+20i)
  • 預期輸出:(-80+10i)

編輯:我注意到第一個前瞻讀取是 10 而不是 40('(') 的 ascii 值。我該如何解決這個問題?next() 方法也不能正常工作(lookahead = tokenizer.nextToken();)

我的代碼:

import java.io.*;
import static java.util.Objects.requireNonNull;

public class Parser {

    private int lookahead;
    private StreamTokenizer tokenizer;
    private final Reader input;
    private final Writer output;
    
    
    public Parser(Reader input, Writer output) throws IOException {
        this.input = requireNonNull(input);
        this.output = requireNonNull(output);
        this.lookahead = this.input.read();
    }
    
    private void next() throws IOException {
        lookahead = tokenizer.nextToken();
    }
    
    private void match(int expected) throws IOException {
        
        if (lookahead != expected) {
            
            switch(expected) {
            
                case '(':
                    System.out.println("Error, missing opening round bracket.");
                    break;
                
                case ')':
                    System.out.println("Error, missing closing round bracket.");
                    break;
                    
                case 'i':
                    System.out.println("Error, missing i");
                    break;
                    
                case '+':
                    System.out.println("Error, missing +");
                    
                default:
                    return;
            }
        } else {
            next();
        }
    }
    
    private void parseExpr() throws IOException {
      
       long[] parameters = new long[4];
       int i = 0;
       
        if (lookahead == '(') {
            match('(');
            
            if (lookahead == StreamTokenizer.TT_NUMBER) {
                parameters[i] = lookahead;
                i++;
                next();
                
            } else {
                System.out.println("Not a number.");
                return;
            }
            
            match('+');
            
            if (lookahead == StreamTokenizer.TT_NUMBER) {
                parameters[i] = lookahead;
                i++;
                next();
            } else {
                System.out.println("Not a number.");
                return;
            }
            
            match('i');
            match(')');
            
            if(lookahead == '+'){
                next();
                parseExpr();
                System.out.println("(" + (parameters[0]+parameters[2]) + "+" +(parameters[1]+parameters[3]) + "i)");
            }
            
            if(lookahead == '-'){
                next();
                parseExpr();
                System.out.println("(" + (parameters[0]-parameters[2]) + "+" +(parameters[1]-parameters[3]) + "i)");
            }
        }
        
        System.out.println("Sorry, I can't help you");
    }
    
    public static void main(String[] args) throws IOException {
        InputStreamReader reader = new InputStreamReader(System.in);
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        OutputStreamWriter writer = new OutputStreamWriter(outputStream);

        Parser parse = new Parser(reader, writer);
        parse.parseExpr();

        writer.close(); // Close and flush output stream writer.

        String output = outputStream.toString();
        System.out.println("Output generated by parser: " + output);
    }
}

但它總是輸出“對不起,我幫不了你”。

我已經測試了你的代碼,我有兩條評論可以幫助你:

  1. 您總是收到相同的錯誤消息,因為您尚未初始化“tokenizer”,請嘗試使用tokenizer = new StreamTokenizer( reader ); 在主要方法中。
  2. 修復后,您會注意到,您收到錯誤“錯誤,缺少 i”,因為在名為“next”的方法之后,屬性“lookahead”的值為“-3”,但 'i' 的 ascii 值是 105。

我希望這有幫助,讓我知道。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM