Ta en char-input fra skanneren

Jeg prøver å finne en måte å ta en char input fra tastaturet.

Jeg prøvde å bruke:

Scanner reader = new Scanner(System.in);
char c = reader.nextChar();

Denne metoden finnes ikke.

Jeg prøvde å ta c som en String. Likevel ville det ikke alltid fungere i alle tilfeller, siden den andre metoden jeg kaller fra min metode krever en char som input. Derfor må jeg finne en måte å eksplisitt ta en char som input.

Noen hjelp?

Løsning

Du kan ta det første tegnet fra Scanner.next:

char c = reader.next().charAt(0);

For å forbruke nøyaktig ett tegn du kan bruke:

char c = reader.findInLine(".").charAt(0);

For å forbruke nøyaktig ett tegn du kan bruke:

char c = reader.next(".").charAt(0);
Kommentarer (12)

Det finnes ingen API-metode for å hente et tegn fra skanneren. Du bør hente strengen ved hjelp av scanner.next() og påkalle String.charAt(0)-metoden på den returnerte strengen.

Scanner reader = new Scanner(System.in);
char c = reader.next().charAt(0);

Bare for å være sikker med mellomrom kan du også først kalle trim() på strengen for å fjerne eventuelle mellomrom.

Scanner reader = new Scanner(System.in);
char c = reader.next().trim().charAt(0);
Kommentarer (0)

Det er tre måter å nærme seg dette problemet på:

  • Kall next() på skanneren, og trekk ut det første tegnet i strengen (f.eks. charAt(0)) Hvis du vil lese resten av linjen som tegn, itererer du over de gjenværende tegnene i strengen. Andre svar har denne koden.

  • Bruk setDelimiter("") for å sette skilletegnet til en tom streng. Dette vil føre til at next() tokenizes til strenger som er nøyaktig ett tegn lange. Så da kan du gjentatte ganger kalle next().charAt(0) for å iterere tegnene. Du kan deretter sette skilletegnet til den opprinnelige verdien og fortsette skanningen på vanlig måte!

  • Bruk leser-API-et i stedet for skanner-API-et. Metoden Reader.read() leverer et enkelt tegn lest fra inndatastrømmen. For eksempel

    Reader reader = new InputStreamReader(System.in);
    int ch = reader.read();
    if (ch != -1) { // sjekk for EOF
        // vi har et tegn ...
    }

Når du leser fra konsollen via System.in, blir inndataene vanligvis bufret av operativsystemet, og bare "frigitt" til applikasjonen når brukeren skriver ENTER. Så hvis du har tenkt at applikasjonen din skal svare på individuelle tastetrykk, kommer dette ikke til å fungere. Du må gjøre noen OS-spesifikke innfødte kodeting for å slå av eller omgå linjebuffering for konsoll på OS-nivå.

Referanse:

Kommentarer (1)