Как работает ввод сканера для символа (Операторы)? - PullRequest
0 голосов
/ 19 апреля 2020

Я написал код о результате для ввода оператора, принятого пользователем, и, пожалуйста, объясните мне, как работает этот ввод символов, потому что, когда я использовал

char operation = s.nextLine (). CharAt (0 );

вместо

char операция = s.next (). CharAt (0);

Затмение показало ошибку.

Код -

    System.out.println("Enter First Number:");
    int a = s.nextInt();

    System.out.println("Enter Second Number:");
    int b = s.nextInt();

    System.out.println("Which Operation you want to execute?");
    s.hasNextLine();
    char operation = s.next().charAt(0);    

    int result = 0;

    switch (operation) {
    case '+' :
        result = a + b;
        break;
    case '-' :
        result = a - b;
        break;
    case '*' :
        result = a * b; 
        break;
    case '/' :
        result = a / b;
        break;
    case '%' :
        result = a % b;
        break;
    default:
        System.out.println("Invalid Operator!");
    }
    System.out.println(result);
    s.close();
}

}

Ответы [ 2 ]

0 голосов
/ 19 апреля 2020

Проблема не из-за s.nextLine(); скорее это из-за s.nextInt(). Проверьте Сканер пропускает nextLine () после использования next () или nextFoo ()? , чтобы узнать больше об этом.

Используйте

int a = Integer.parseInt(s.nextLine());

вместо

int a = s.nextInt();

Я бы порекомендовал вам создать служебную функцию, например, getInteger, как это было создано в в этом ответе , для работы также с исключительным сценарием ios.

0 голосов
/ 19 апреля 2020

Из документации сканера https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#nextLine ()

Перемещает этот сканер за пределы текущей строки и возвращает пропущенный ввод. Этот метод возвращает остаток текущей строки, исключая любой разделитель строк в конце. Позиция устанавливается в начале следующей строки.

Поскольку этот метод продолжает поиск по вводу в поисках разделителя строк, он может буферизовать весь ввод, ищущий строку, чтобы пропустить, если нет разделителей строк присутствуют.

Так что, если вы установите .nextLine (), вы на самом деле читаете то, что осталось после последнего ввода в следующую строку (ie ничего). Это можно продемонстрировать с помощью этого кода

Scanner s = new Scanner(System.in);
System.out.println("Enter First Number:");
int a = s.nextInt();

System.out.println("Enter Second Number:");
int b = s.nextInt();

System.out.println("Which Operation you want to execute?");
s.hasNextLine();
String s1 = s.nextLine();
String s2 = s.nextLine();
System.out.println(s1);
System.out.println(s2);
//char operation = s1.charAt(0); -> error
char operation = s2.charAt(0);//operator is read

Первый отпечаток (s1) ничего не печатает. Второй напечатает оператор.

...