Problem z walidacją input Scanner

Odpowiedz Nowy wątek
2019-09-08 15:27
0

Mam taki kod:

Scanner scanner = new Scanner(System.in);
        boolean gameOver = false;
        while (!gameOver) {
            System.out.println("Input :");
            String operation = scanner.next();
            if (operation.equals("start")) {
                String user1 = scanner.next();

                if (user1.equals("user") || user1.equals("easy")) {
                    String user2 = scanner.next();
                    if (user2.equals("user") || user2.equals("easy")) {
                        System.out.println(user1 + " " + user2);
                    } else System.out.println("Bad parameter");
                } else System.out.println("Bad parameter");
            } else if (operation.equals("exit")) {
                gameOver = true;
            } else System.out.println("Bad parameter");
        }

Jak wpisuje start user user jest dobrze .
Jak zrobić żeby po wpisaniu samego start albo start z pierwszym inputem wyświetliło "bad parameter". Jak wpisuje samo start i wciskam enter przechodzi mi do następnej lini i muszę coś wpisać a ja chciałbym żeby po wciśnięciu enter wypisało mi błąd i pętla zaczeła iteracje od początku. Muszę mieć te trzy inputy.
Ktoś może pomóc ?

edytowany 1x, ostatnio: pawlo135, 2019-09-08 15:32

Pozostało 580 znaków

2019-09-08 17:43
0

Jak zrobić żeby po wpisaniu samego start albo start z pierwszym inputem wyświetliło "bad parameter". Jak wpisuje samo start i wciskam enter przechodzi mi do następnej lini

Bo oo wpisaniu "start" -> czekasz na kolejny input (scanner.next()).
Nie rozumiem co dokładnie chcesz osiągnąć. Mógłbyś napisać jak ten program ma działać? Czemu start + pierwszy input ma wyświetlać "bad parameter"?


edytowany 1x, ostatnio: mfabjanski, 2019-09-08 17:43

Pozostało 580 znaków

2019-09-08 21:06
0

Mają być trzy inputy pierwszy może przyjmować start albo exit. jak wpisze start ma przechodzić do drugiego inputa jak exit ma wychodzić z pętli a jak wpiszę cokolwiek innego ma wpisać "Bad parameters!" i zacząć od nowa iterację pętli.
Drugi input ma przyjmować easy lub user i ma przechodzić do następnego inputa a jak wpiszę coś innego ma wypisać "Bad parameters!"
Trzeci input ma przyjmować tak samo jak w drugim easy albo user i ma wypisać te dwa inputy a jak wpiszę coś innego to ma wyświetlić "Bad parameters!".
I właśnie jak wpisuje np start user user wpisuje mi te dwa inputy. Ale jak wpisuje samo start i wciskam enter przechodzi mi do następnej linijki i mam wpisać następny input i dopóki nic nie wpiszę nie chce przejść dalej. A ja chce żeby po enterze wyświetliło mi że błędny parametr i nie wiem jak to zrobić. Myślę że już trochę jaśniej wytłumaczyłem

To ma działać mniej więcej tak tak:
Input command: start
Bad parameters!
Input command: start easy
Bad parameters!
Input command: start easy easy // jest doprze wypisuje
a działa tak
Input command: start
//nowa linijka

i dopóki nic nie wpiszę nie przechodzi dalej

edytowany 1x, ostatnio: pawlo135, 2019-09-08 21:07

Pozostało 580 znaków

2019-09-08 21:33
0

Jak przechodzisz w głąb kolejnych if'ów też powinieneś dać pętle. Może coś takiego... tylko w liniach 15 i 20 zamiast return daj break wtedy tylko wyjdzie z tej pęlti się zamiast zamykać porgram.

import java.util.*;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        boolean gameOver = false;
        while (!gameOver) {
            System.out.println("Input :");
            String operation = scanner.nextLine();
            if (operation.equals("start")) {  
                String u1 = "";
                while(!u1.equals("exit")) {
                    u1 = scanner.nextLine();
                    if (u1.equals("exit")) return;
                    if (u1.equals("user") || u1.equals("easy")) {
                        String u2 = "";
                        while(!u2.equals("exit")) {
                            u2 = scanner.nextLine();
                            if (u2.equals("exit")) return;
                            System.out.println(1);
                            if (u2.equals("user") || u2.equals("easy")) {
                               System.out.println(2);
                            } else System.out.println("Bad parameter");
                        }
                    } else System.out.println("Bad parameter");
                }
            } else if (operation.equals("exit")) {
                gameOver = true;
            } else System.out.println("Bad parameter");
        }
    }

}
Nie o to chodzi, nie może być nextline bo musi być możliość wpisania wszystkich inputów w jednej lini . - pawlo135 2019-09-08 22:04
to zmień w liniach 10, 14, 29 z nextLine() na next() i wpisz start user user albo start easy user. Jak wpiszesz cos innego jak start kkk uu wtedy wejdzie do pierwszego ifa, ale wywali bledy dla tych dwoch argumentow po start. W kazdym razie sprobowalem pomoc ;p To tyle co moglem zrobic. - goose_ 2019-09-08 22:10
Sprawdź na repl, kliknij na link, Daj run i Sprawdź czy to się zachowuje tak jak Chcesz:https://repl.it/repls/DelightfulImpressionableSymbols - lion137 2019-09-08 22:11
to z repla to niestety nie o to chodzi tu macie linka jak to u mnie wygląda może to bardziej rozjaśni https://zapodaj.net/06375d58468f8.png.html i właśnie jak wpiszę samo start i wcisnę enter to chcę żeby mi wypisało bad parameters i tak samo jak wpiszę dwa inputy i enter czyli np start user ma wyskakiwać bad parameters żeby tylko przechodziło jak są trzy. Tu jak wpisuje jeden input i naciskam enter to każe mi coś wpisywać a chcę żeby wyskoczył bad parameter - pawlo135 2019-09-08 22:29
To ja wymiękam, ja tego nie rozumiem. - lion137 2019-09-08 22:34

Pozostało 580 znaków

2019-09-08 21:41
0

Po kilku próbach wychodzi, że powyższe rozwiązanie nie zachowuje się zgodnie z opisem. Zakoduj bezpośrednio to co Napisałęś w drugim swoim poście, tak by to było w pseudokodzie:

prompt = "=> "

while True:
    inp = input("start=> ")
    if inp == "exit":
        print("Bye\n")
        break
    else if inp == "start":
        inp = input(prompt)
        if inp == "easy" or inp == "user":
            inp = input(prompt)
            if inp == "easy" or inp == "user":
                print(inp)
            else:
                print("Bad parameters\n")
                continue
        else:
            print("Bad parameters\n")
            continue
    else:
        print("Bad parameters\n")
        continue

Na początku input jest inny, żeby wyróżnić tą sytuację.


Pozostało 580 znaków

2019-09-08 21:42
0

Proponowałbym zrobić sprawdzanie za pomocą RegExp


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2019-09-08 22:35
cs
0

A może po prostu tak:

public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while(true){
            String input = scanner.nextLine().toLowerCase().replaceAll("\\s+"," ").trim();
            switch(input){
                case "start user easy":
                case "start easy user":
                    System.out.println("OK");
                    break;
                case "end":
                    System.out.println("Game over");
                    return;
                default:
                    System.out.println("Bad parameters");
            }
        }
    }

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0