Nehmen Sie eine Zeicheneingabe vom Scanner


124

Ich versuche einen Weg zu finden, um eine charEingabe von der Tastatur zu übernehmen.

Ich habe versucht:

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

Diese Methode existiert nicht.

Ich habe versucht, cals String. Dies würde jedoch nicht immer in jedem Fall funktionieren, da für die andere Methode, die ich von meiner Methode aus aufrufe, chareine Eingabe erforderlich ist . Daher muss ich einen Weg finden, ein Zeichen explizit als Eingabe zu verwenden.

Irgendeine Hilfe?

Antworten:


159

Sie könnten das erste Zeichen nehmen von Scanner.next:

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

Um genau ein Zeichen zu verbrauchen , können Sie Folgendes verwenden:

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

Zu verbrauchen streng ein Zeichen könnten Sie verwenden:

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


7
Eigentlich nimmt es mehr als einen Charakter, aber es wirkt nur auf den ersten Charakter
Ralph

1
@ user1804697, um nur Zeichen zu verbrauchen, verwenden Siechar c = reader.next("[a-zA-Z]").charAt(0);
Reimeus

10
Was ist in diesem Zusammenhang der Unterschied zwischen "genau" und "streng"?

2
@Reimeus Was genau ist der Wert, wenn Sie Code einfügen und dann ausführen?
Bharal

53

Scanner einrichten:

reader.useDelimiter("");

Danach reader.next()wird eine einstellige Zeichenfolge zurückgegeben.


17

Es gibt keine API-Methode, um ein Zeichen vom Scanner abzurufen. Sie sollten den String mit der Methode scanner.next()return String.charAt(0)für den zurückgegebenen String abrufen und aufrufen .

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

trim()Um mit Whitespaces sicher zu sein, können Sie auch zuerst die Zeichenfolge aufrufen , um Whitespaces zu entfernen.

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

Würden Sie nicht reader.next()schon die Zeichenfolge geben, die mit dem ersten nicht weißen Zeichen beginnt?
norok2

12

Es gibt drei Möglichkeiten, um dieses Problem anzugehen:

  • Rufen Sie next()den Scanner auf und extrahieren Sie das erste Zeichen der Zeichenfolge (z. B. charAt(0)). Wenn Sie den Rest der Zeile als Zeichen lesen möchten, durchlaufen Sie die verbleibenden Zeichen in der Zeichenfolge. Andere Antworten haben diesen Code.

  • Verwenden Sie setDelimiter("")diese Option , um das Trennzeichen auf eine leere Zeichenfolge festzulegen. Dies führt next()zu einer Tokenisierung in Zeichenfolgen, die genau ein Zeichen lang sind. Dann können Sie wiederholt aufrufen next().charAt(0), um die Zeichen zu wiederholen . Sie können dann das Trennzeichen auf den ursprünglichen Wert setzen und den Scanvorgang auf normale Weise fortsetzen!

  • Verwenden Sie die Reader-API anstelle der Scanner-API. Die Reader.read()Methode liefert ein einzelnes Zeichen, das aus dem Eingabestream gelesen wird. Beispielsweise:

    Reader reader = new InputStreamReader(System.in);
    int ch = reader.read();
    if (ch != -1) {  // check for EOF
        // we have a character ...
    }

Wenn Sie von der Konsole über lesen System.in, wird die Eingabe normalerweise vom Betriebssystem gepuffert und nur dann für die Anwendung "freigegeben", wenn der Benutzer ENTER eingibt. Wenn Sie also beabsichtigen, dass Ihre Anwendung auf einzelne Tastaturanschläge reagiert, funktioniert dies nicht. Sie müssten einige betriebssystemspezifische native Code-Aufgaben ausführen, um die Zeilenpufferung für die Konsole auf Betriebssystemebene zu deaktivieren oder zu umgehen.

Referenz:


Könnten Sie bitte ein Beispiel für das geben, was Sie gesagt haben
Ralph

4

Sie können dieses Problem lösen, indem Sie ganz einfach "Tastatureingaben einzeln" abrufen. Ohne einen Scanner alle verwenden zu müssen und auch den Eingabepuffer nicht als Nebeneffekt zu löschen, verwenden Sie diesen.

char c = (char)System.in.read();

Wenn Sie nur die gleiche Funktionalität wie die C-Sprache "getChar ()" benötigen, funktioniert dies hervorragend. Der große Vorteil von "System.in.read ()" ist, dass der Puffer nicht nach jedem Zeichen gelöscht wird. Wenn Sie also immer noch alle Benutzereingaben benötigen, können Sie den Rest aus dem Eingabepuffer abrufen. Der "char c = scanner.next().charAt(0);"Weg greift zwar nach dem Zeichen, löscht aber den Puffer.

// Java program to read character without using Scanner
public class Main
{
    public static void main(String[] args)
    {
        try {
            String input = "";
            // Grab the First char, also wait for user input if the buffer is empty.
            // Think of it as working just like getChar() does in C.
            char c = (char)System.in.read();
            while(c != '\n') {
                //<do your magic you need to do with the char here>
                input += c; // <my simple magic>

                //then grab the next char
                c = (char)System.in.read();
            }
            //print back out all the users input
            System.out.println(input);
        } catch (Exception e){
            System.out.println(e);
        }
    }
}  

Hoffe das hilfreich und viel Glück! PS Tut mir leid, ich weiß, dass dies ein älterer Beitrag ist, aber ich hoffe, dass meine Antwort neue Erkenntnisse bringt und anderen Menschen helfen könnte, die ebenfalls dieses Problem haben.


3

Das funktioniert eigentlich nicht:

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

Diese Frage enthält einige gute Erklärungen und Referenzen: Warum verfügt die Scannerklasse nicht über eine nextChar-Methode? "Ein Scanner unterteilt seine Eingabe mithilfe eines Begrenzungsmusters in Token", was ziemlich offen ist. Zum Beispiel, wenn Sie dies verwenden

c = lineScanner.next().charAt(0);

Für diese Eingabezeile "(1 + 9) / (3 - 1) + 6 - 2" wird der Aufruf zum nächsten zurückgegeben "(1", c wird auf "(" gesetzt, und Sie verlieren am Ende das " 1 'beim nächsten Aufruf zum nächsten ()

Wenn Sie einen Charakter erhalten möchten, möchten Sie normalerweise Leerzeichen ignorieren. Das hat bei mir funktioniert:

c = lineScanner.findInLine("[^\\s]").charAt(0);

Referenz: Regex für ein einzelnes Zeichen, das alles andere als ein Leerzeichen ist


Zu Ihrer Information"[^\\s]" === "\\S"
Bohemian

2

Der beste Weg, um ein Zeichen in der Scannerklasse einzugeben, ist:

Scanner sca=new Scanner(System.in);
System.out.println("enter a character");
char ch=sca.next().charAt(0);

1
import java.util.Scanner;

public class userInput{
    public static void main(String[] args){
        // Creating your scanner with name kb as for keyBoard
        Scanner kb = new Scanner(System.in);

        String name;
        int age;
        char bloodGroup;
        float height;

        // Accepting Inputs from user
        System.out.println("Enter Your Name");
        name = kb.nextLine(); // for entire line of String including spaces
        System.out.println("Enter Your Age");
        age = kb.nextInt(); // for taking Int
        System.out.println("Enter Your BloodGroup : A/B/O only");
        bloodGroup  = kb.next().charAt(0); // For character at position 0
        System.out.println("Enter Your Height in Meters");
        height = kb.nextFloat(); // for taking Float value

        // closing your scanner object
        kb.close();

        // Outputting All
        System.out.println("Name : " +name);
        System.out.println("Age : " +age);
        System.out.println("BloodGroup : " +bloodGroup);
        System.out.println("Height : " +height+" m");

    }
}


1

Sie sollten Ihren benutzerdefinierten Eingabeleser verwenden, um schnellere Ergebnisse zu erzielen, anstatt das erste Zeichen aus dem Lesen von String zu extrahieren. Link für Custom ScanReader und Erläuterung: https://gist.github.com/nik1010/5a90fa43399c539bb817069a14c3c5a8

Code zum Scannen von Char:

BufferedInputStream br=new BufferedInputStream(System.in);
char a= (char)br.read();

Sie sollten den Code aus dem Kern Ihrer Antwort hinzufügen, da er möglicherweise irgendwann nicht mehr verfügbar ist.
Markus

@ Markus zum Scannen von Zeichen hinzugefügt.
NIKUNJ KHOKHAR

1

Es gibt zwei Ansätze, können Sie entweder genau ein Zeichen oder streng ein Zeichen. Wenn Sie genau verwenden, nimmt der Leser nur das erste Zeichen, unabhängig davon, wie viele Zeichen Sie eingeben.

Beispielsweise:

import java.util.Scanner;  

public class ReaderExample {  

    public static void main(String[] args) {  

        try {  

        Scanner reader = new Scanner(System.in);

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

            reader.close();  

            System.out.print(c);

        } catch (Exception ex) {  

            System.out.println(ex.getMessage());  

        }



    }  

}  

Wenn Sie eine Reihe von Zeichen als Eingabe angeben, z. B. "abcd", berücksichtigt der Leser nur das erste Zeichen, dh den Buchstaben "a".

Wenn Sie jedoch streng verwenden, sollte die Eingabe nur ein Zeichen sein. Wenn die Eingabe mehr als ein Zeichen umfasst, nimmt der Leser die Eingabe nicht entgegen

import java.util.Scanner;  

public class ReaderExample {  

    public static void main(String[] args) {  

        try {  

        Scanner reader = new Scanner(System.in);

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

            reader.close();  

            System.out.print(c);

        } catch (Exception ex) {  

            System.out.println(ex.getMessage());  

        }



    }  

}  

Angenommen, Sie geben die Eingabe "abcd" ein, es wird keine Eingabe vorgenommen, und die Variable c hat den Wert Null.


0
package Pack;

import java.util.Scanner;

public class test { 
    public static void main(String[] args) {

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

    }
}

Um nur ein Zeichen zu erhalten char c = reader.next ("."). CharAt (0);


Um nur ein Zeichen zu erhalten char c = reader.next ("."). CharAt (0);
Rakesh Kumar B

0
// Use a BufferedReader to read characters from the console.
import java.io.*;
class BRRead {
public static void main(String args[]) throws IOException
{
char c;
BufferedReader br = new
BufferedReader(new InputStreamReader(System.in));
System.out.println("Enter characters, 'q' to quit.");
// read characters
do {
c = (char) br.read();
System.out.println(c);
} while(c != 'q');
}
}

0

Sie sollten den String mit scanner.next () abrufen und die String.charAt (0) -Methode für den zurückgegebenen String aufrufen.
Beispiel:

    import java.util.Scanner;

    public class InputC{


            public static void main(String[] args) {
                // TODO Auto-generated method stub
                   // Declare the object and initialize with
                   // predefined standard input object
                    Scanner scanner = new Scanner(System.in);
                    System.out.println("Enter a character: ");
                    // Character input
                    char c = scanner.next().charAt(0);
                    // Print the read value
                    System.out.println("You have entered: "+c);
            }


        }

Ausgabe

Enter a character: 
a
You have entered: a

0

Sie müssen dies nur schreiben, um den Wert vom Typ char zu erhalten.

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

-1
import java.io.*;

class abc // enter class name (here abc is class name)
{
    public static void main(String arg[])
    throws IOException // can also use Exception
    {
        BufferedReader z =
            new BufferedReader(new InputStreamReader(System.in));

        char ch = (char) z.read();
    } // PSVM
} // class

-1

Versuche dies

Scanner scanner=new Scanner(System.in);
String s=scanner.next();
char c=s.charAt(0);

-1
Scanner key = new Scanner(System.in);
//shortcut way 
char firstChar=key.next().charAt(0);  
//how it works;
/*key.next() takes a String as input then,
charAt method is applied on that input (String)
with a parameter of type int (position) that you give to get      
that char at that position.
You can simply read it out as: 
the char at position/index 0 from the input String
(through the Scanner object key) is stored in var. firstChar (type char) */

//you can also do it in a bit elabortive manner to understand how it exactly works
String input=key.next();  // you can also write key.nextLine to take a String with spaces also
char firstChar=input.charAt(0);
char charAtAnyPos= input.charAt(pos);  // in pos you enter that index from where you want to get the char from

Übrigens können Sie ein Zeichen nicht direkt als Eingabe verwenden. Wie Sie oben sehen können, wird zuerst ein String und dann das Zeichen (0) verwendet. gefunden und gespeichert wird


-1

Benutz einfach...

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

Dies erhält das erste Zeichen der nächsten Eingabe.


-2

Sie könnten Typecasting verwenden:

Scanner sc= new Scanner(System.in);
char a=(char) sc.next();

Auf diese Weise nehmen Sie aufgrund der Funktion 'next ()' Eingaben in String vor, diese werden jedoch aufgrund des in den Klammern angegebenen 'char' in Zeichen umgewandelt.

Diese Methode zur Konvertierung des Datentyps durch Angabe des Zieldatentyps in Klammern wird als Typisierung bezeichnet. Es funktioniert für mich, ich hoffe es funktioniert für dich :)


Sie können a Stringbis a nicht typisieren char.
Stephen C

-3

Um den Index eines Zeichens in einem bestimmten Stich zu finden, können Sie diesen Code verwenden:

package stringmethodindexof;

import java.util.Scanner;
import javax.swing.JOptionPane;

/**
 *
 * @author ASUS//VERY VERY IMPORTANT
 */
public class StringMethodIndexOf {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        String email;
        String any;
        //char any;

//any=JOptionPane.showInputDialog(null,"Enter any character or string to find out its INDEX NUMBER").charAt(0);       
//THE AVOBE LINE IS FOR CHARACTER INPUT LOL
//System.out.println("Enter any character or string to find out its INDEX NUMBER");
       //Scanner r=new Scanner(System.in);
      // any=r.nextChar();
        email = JOptionPane.showInputDialog(null,"Enter any string or anything you want:");
         any=JOptionPane.showInputDialog(null,"Enter any character or string to find out its INDEX NUMBER");
        int result;
        result=email.indexOf(any);
        JOptionPane.showMessageDialog(null, result);

    }

}

-7

Am einfachsten ist es, zuerst die Variable in einen String zu ändern und die Eingabe als String zu akzeptieren. Anschließend können Sie basierend auf der Eingabevariablen mit einer if-else- oder switch-Anweisung wie folgt steuern.

Scanner reader = new Scanner(System.in);

String c = reader.nextLine();
switch (c) {
    case "a":
        <your code here>
        break;
    case "b":
        <your code here>
        break;
    default: 
        <your code here>
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.