如何在用户输入中分离两种数据类型?

时间:2015-01-19 11:20:23

标签: java

我正在创建一个计算器,用户将直接输入数字和操作员......

这是我的代码:

int answer = 0;
int num1, num2;
char operator;
System.out.print("Enter calculation: ");
num1 = kb.nextInt();
operator = kb.next().charAt(0);
num2 = kb.nextInt();

当存在如下空格时,上面的代码将接受用户输入:

1 + 1

所以程序会给出一个2的答案。

但如果我输入1+1,则会出错

Exception in thread "main" java.util.InputMismatchException

我该怎么做才能将整数与字符分开?因为我将运算符设置为字符。这样它就可以接受一位数到几位数。与500+841520/87230*5148-65

一样

4 个答案:

答案 0 :(得分:0)

尝试使用3台扫描仪吗?

Scanner scn = new Scanner(System.in);

int operand1, operand2;
String operator;

operand1 = Integer.parseInt(scn.next());
operator = scn.next();
operand2 = Integer.parseInt(scn.next());

OP改变了我离开的问题。 我发布此解决方案后,我刚才离开了。没有时间改进它。现在我给你一个更好简单 解决方案

我认为你不希望用户输入类似" 12 + 45 * 67/20"对?假设有两个操作数。

1)接收输入为1整个字符串

2)修剪输入中的所有空格

3)将字符串拆分为整数标记

Scanner scn = new Scanner(System.in);   
String[] token = new String[12];        
System.out.print("Enter equation:");
String input = scn.nextLine().trim();
String operator = "";
double answer=0, operand1=0, operand2=0;

if (input.indexOf("+") != -1){
    token = input.split("\\+");
    operator = "+";
}
else if (input.indexOf("-") != -1){
    token = input.split("-");
    operator = "-";
}
else if (input.indexOf("*") != -1){
    token = input.split("\\*");
    operator = "*";
}
else if (input.indexOf("/") != -1){
    token = input.split("/");
    operator = "/";
}
else
    System.out.println("Invalid equation!");

if(token[0].matches("[0-9]+") && token[1].matches("[0-9+]"))
{
    operand1 = Double.parseDouble(token[0]);
    operand2 = Double.parseDouble(token[1]);
    switch (operator)
    {
        case "+": answer = operand1 + operand2;
                  break;
        case "-": answer = operand1 - operand2;
                  break;
        case "*": answer = operand1 * operand2;
                  break;
        case "/": answer = operand1 / operand2;
                  break;
    }
}
System.out.println(answer);

只需复制并粘贴整个内容即可测试它,它会起作用。

答案 1 :(得分:0)

它不期望负操作数。如果数字太大,它会抛出异常。它没有解释表达式中的"错误"是。所以还有很大的改进空间。

Scanner scn = new Scanner( System.in );
Pattern pat = Pattern.compile( "\\s*(\\d+)\\s*([-+*/])\\s*(\\d+)\\s*" );

while( scn.hasNextLine() ){
    String line = scn.nextLine();
    Matcher mat = pat.matcher( line );
    if( mat.matches() ){
        int op1 = Integer.parseInt( mat.group(1) );
        char od = mat.group(2).charAt(0);
        int op2 = Integer.parseInt( mat.group(3) );
        System.out.println( op1 + " " + od + " " + op2 );
    } else {
        System.out.println( "error in expression" );
    }
}

这是一个更简单的版本。类似的警告也适用于此。此外,它会对无效数字抛出异常,几乎可以接受任何操作符。

Scanner scn = new Scanner( System.in );
scn.useDelimiter( "\\b|\\s+" );
while( scn.hasNextLine() ){
    int op1 = scn.nextInt();
    char od = scn.next().charAt(0);
    int op2 = scn.nextInt();
    System.out.println( op1 + " " + od + " " + op2 );
    scn.nextLine();
}

答案 2 :(得分:0)

我对java.util.Scanner课程没有太多经验。但是,我怀疑它在明确定义的标记分隔符上进行标记,例如空格,制表符,逗号,管道字符等。因此,在标记输入类型时,这可能是一个糟糕的选择

为了成功标记您的输入类型,我建议您实现一个正确的词法分析器。这可能是一种过度杀戮(比如使用坦克来捕捉兔子),但为了保证成功,你需要编写一个词法分析器。网络充满了编写词法分析器的例子。对于您的输入,它可能看起来像这样:

public class Scanners {
    public static void main(String args[]) {
        Lexer lexer = new Lexer("32221-8  +45     ");
        for(String token : lexer)
            System.out.println("token = "+token);
    }
    private static final class Lexer implements Iterable<String> {
        private int pos=0;
        private final String input;
        private final int inputLength;
        private String token;
        public Lexer(String input) {
            this.input = input;
            this.inputLength = input.length();
            advance();
        }
        private void advance() {
            if(pos>=inputLength) {
                token = null;
                return;
            }
            char c = input.charAt(pos++);
            if(Character.isDigit(c))
                token = advanceNumber(c);
            else if(Character.isJavaIdentifierStart(c))
                token = advanceVariable(c);
            else if(Character.isWhitespace(c)) {
                advanceWhitespace();
                advance();
            } else
                // here, assuming a one-character operator
                token = Character.toString(c);
        }

        private String advanceNumber(char c) {
            StringBuilder sb = new StringBuilder().append(c);
            while(pos<inputLength) {
                c = input.charAt(pos);
                if(Character.isDigit(c)) {
                    sb.append(c);
                    ++pos;
                } else
                    break;
            }
            return sb.toString();
        }

        private String advanceVariable(char c) {
            StringBuilder sb = new StringBuilder().append(c);
            while(pos<inputLength) {
                c = input.charAt(pos);
                if(Character.isJavaIdentifierPart(c)) {
                    sb.append(c);
                    ++pos;
                } else
                    break;
            }
            return sb.toString();
        }

        private void advanceWhitespace() {
            while(pos<inputLength && Character.isWhitespace(input.charAt(pos)))
                ++pos;
        }

        @Override
        public Iterator<String> iterator() {
            return new Iterator<String>() {
                @Override
                public boolean hasNext() {
                    return token != null;
                }

                @Override
                public String next() {
                    String retval = token;
                    advance();
                    return retval;
                }

                @Override
                public void remove() {
                    throw new UnsupportedOperationException();
                }
            };
        }
    }
}

// output
// ------
// token = 32221
// token = -
// token = 8
// token = +
// token = 45

答案 3 :(得分:-2)

你可以这样做:

    Scanner scn = new Scanner(System.in);
    Integer operand1, operand2;
    char operator;

    System.out.println("Enter first operand: ");
    operand1 = scn.nextInt();
    System.out.println("Enter operator: ");
    operator = scn.next().charAt(0);
    System.out.println("Enter second operand: ");
    operand2 = scn.nextInt();