it-swarm.com.de

Nehmen Sie eine Zeicheneingabe vom Scanner

Ich versuche einen Weg zu finden, eine char-Eingabe von der Tastatur zu übernehmen.

Ich habe versucht mit:

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

Diese Methode existiert nicht.

Ich habe versucht, c als String zu nehmen. Es würde jedoch nicht immer in jedem Fall funktionieren, da die andere Methode, die ich aus meiner Methode aufrufe, eine char als Eingabe erfordert. Daher muss ich einen Weg finden, ein Zeichen explizit als Eingabe zu verwenden.

Irgendeine Hilfe?

104
Ralph

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

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

Genau ein Zeichen verbrauchen, das Sie verwenden könnten:

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

Um ausschließlich ein Zeichen zu verwenden, können Sie Folgendes verwenden:

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

Scanner einrichten:

reader.useDelimiter("");

Danach gibt reader.next() eine Zeichenfolge aus einem Zeichen zurück. 

47
hoat4

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

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

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

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

Es gibt drei Möglichkeiten, dieses Problem anzugehen:

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

  • Verwenden Sie setDelimiter(""), um das Trennzeichen auf eine leere Zeichenfolge zu setzen. Dies bewirkt, dass next() in Strings getoken wird, die genau ein Zeichen lang sind. Dann können Sie wiederholtnext().charAt(0) aufrufen, um die Zeichen zu durchlaufen. Sie können dann das Trennzeichen auf seinen 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 Eingabestrom gelesen wird. Zum Beispiel:

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

Wenn Sie über System.in von der Konsole aus lesen, wird die Eingabe normalerweise vom Betriebssystem gepuffert und für die Anwendung nur "freigegeben", wenn der Benutzer ENTER drückt. Wenn Sie also beabsichtigen, dass Ihre Anwendung auf einzelne Tastaturanschläge reagiert, wird dies nicht funktionieren. Sie müssten ein paar betriebssystemspezifische systemeigene Codes ausführen, um die Zeilenpufferung für die Konsole auf Betriebssystemebene zu deaktivieren oder umzugehen.

Referenz:

9
Stephen C

Das funktioniert eigentlich nicht:

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

Es gibt einige gute Erklärungen und Verweise in dieser Frage: Warum hat die Scanner-Klasse keine nextChar-Methode? "Ein Scanner zerlegt seine Eingabe in Token mit einem Trennzeichenmuster", was ziemlich offen ist. Zum Beispiel, wenn Sie dies verwenden

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

für diese Zeile der Eingabe "(1 + 9)/(3 - 1) + 6 - 2" Der nächste Aufruf gibt "(1" zurück, c wird auf '(' und Sie 'gesetzt) am Ende verliert ich die '1' beim nächsten Aufruf von next ()

Normalerweise, wenn Sie einen Charakter erhalten möchten, den Sie Leerzeichen ignorieren möchten. Das hat für mich funktioniert:

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

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

3
gary69

Sie können dieses Problem lösen, indem Sie die Tastatureingabe "Zeichen für Zeichen" ganz einfach "greifen". Ohne einen Scanner all verwenden zu müssen und den Eingabepuffer nicht als Nebeneffekt zu löschen, indem Sie diesen verwenden. 

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

Wenn Sie nur die gleiche Funktionalität wie die C-Funktion "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 noch alle Benutzereingaben benötigen, können Sie den Rest noch aus dem Eingabepuffer abrufen. Die Funktion "char c = scanner.next().charAt(0);" greift das Zeichen, löscht jedoch 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! P.S. Tut mir leid, ich weiß, dass dies ein älterer Beitrag ist, aber ich hoffe, dass meine Antwort neue Erkenntnisse bringt und möglicherweise anderen Menschen helfen könnte, die ebenfalls dieses Problem haben. 

2

Die beste Methode zur Eingabe eines Zeichens in der Scanner-Klasse ist:

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

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

Zum Beispiel:

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 einen Zeichensatz als Eingabe eingeben, z. B. "abcd", berücksichtigt der Leser nur das erste Zeichen, d. H. Den Buchstaben "a".

Bei strikter Verwendung sollte die Eingabe jedoch nur aus einem Zeichen bestehen. Wenn die Eingabe mehr als ein Zeichen umfasst, nimmt der Leser die Eingabe nicht an

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 "abcd" ein, es wird keine Eingabe vorgenommen, und die Variable c hat den Wert Null.

1
Omkar hiremath

Sie sollten Ihren benutzerdefinierten Eingabe-Reader für schnellere Ergebnisse verwenden, anstatt das erste Zeichen aus dem Lesen von String zu extrahieren. Link für Custom ScanReader und Erklärung: https://Gist.github.com/nik1010/5a90fa43399c539bb817069a14c3c5a8

Code zum Scannen von Zeichen: 

BufferedInputStream br=new BufferedInputStream(System.in);
char a= (char)br.read();
1
NIKUNJ KHOKHAR
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
HellPreacher
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);

0
Rakesh Kumar B
// 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
John Born

Sie sollten den String mit scanner.next () abrufen und die Methode String.charAt (0) 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
AbdoCosmos

Versuchen Sie Folgendes: char c = S.nextLine (). CharAt (0);

0
Harshal Mande