web-dev-qa-db-fra.com

Prendre une entrée de caractère du scanner

J'essaie de trouver un moyen de prendre une entrée char à partir du clavier.

J'ai essayé d'utiliser:

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

Cette méthode n'existe pas.

J'ai essayé de prendre c comme String. Cependant, cela ne fonctionnerait pas toujours dans tous les cas, car l’autre méthode que j’appelle depuis ma méthode nécessite une variable char. Par conséquent, je dois trouver un moyen de prendre explicitement un caractère en tant qu'entrée.

De l'aide?

104
Ralph

Vous pouvez prendre le premier caractère de Scanner.next:

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

Pour consommer exactement un caractère que vous pourriez utiliser:

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

Pour consommer strictement un caractère que vous pourriez utiliser:

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

Scanner d'installation:

reader.useDelimiter("");

Après cette reader.next(), une chaîne de caractères unique sera renvoyée. 

47
hoat4

Il n'y a pas de méthode API permettant d'obtenir un caractère du scanner. Vous devriez obtenir la chaîne en utilisant scanner.next() et appeler la méthode String.charAt(0) sur la chaîne renvoyée.

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

Juste pour être sûr avec les espaces blancs, vous pouvez également appeler trim() sur la chaîne pour supprimer les espaces blancs.

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

Il y a trois façons d'aborder ce problème:

  • Appelez next() sur le scanner et extrayez le premier caractère de la chaîne (par exemple charAt(0)). Si vous souhaitez lire le reste de la ligne sous forme de caractères, parcourez les autres caractères de la chaîne. Les autres réponses ont ce code.

  • Utilisez setDelimiter("") pour définir le délimiteur sur une chaîne vide. Cela entraînera next() tokenize en chaînes qui ont exactement un caractère. Ainsi, vous pouvez à plusieurs reprises appeler next().charAt(0) pour itérer les caractères. Vous pouvez ensuite régler le délimiteur sur sa valeur d'origine et reprendre la numérisation de la manière habituelle!

  • Utilisez l'API Reader au lieu de l'API Scanner. La méthode Reader.read() fournit un seul caractère lu à partir du flux d'entrée. Par exemple:

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

Lorsque vous lisez à partir de la console via System.in, l'entrée est généralement mise en mémoire tampon par le système d'exploitation et n'est "libérée" dans l'application que lorsque l'utilisateur tape ENTRÉE. Donc, si vous souhaitez que votre application réponde à des frappes de clavier individuelles, cela ne fonctionnera pas. Vous auriez besoin de créer du code natif spécifique au SE pour désactiver ou contourner la mise en mémoire tampon de lignes pour la console au niveau du SE.

Référence:

9
Stephen C

Cela ne fonctionne pas réellement:

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

Il y a quelques bonnes explications et références dans cette question: Pourquoi la classe Scanner n’a-t-elle pas de méthode nextChar? "Un scanner décompose sa saisie en jetons à l'aide d'un motif de délimiteur", ce qui est plutôt ouvert. Par exemple, lorsque vous utilisez cette

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

pour cette ligne d'entrée "(1 + 9)/(3 - 1) + 6 - 2" l'appel de next retourne "(1", c sera mis à "(" et " ll finira par perdre le '1' lors du prochain appel à next ()

Généralement, lorsque vous souhaitez obtenir un personnage, vous souhaitez ignorer les espaces. Cela a fonctionné pour moi:

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

Référence: regex pour faire correspondre un seul caractère qui est tout sauf un espace

3
gary69

Vous pouvez résoudre ce problème, qui consiste à "saisir le clavier un caractère à la fois" très simplement. Sans avoir à utiliser un scanner tout et ne pas effacer le tampon d'entrée comme un effet secondaire, en utilisant ceci. 

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

Si tout ce dont vous avez besoin est la même fonctionnalité que la fonction "getChar ()" du langage C, cela fonctionnera très bien. Le gros avantage de "System.in.read ()" est que la mémoire tampon n'est pas effacée après chaque caractère de votre capture. Donc, si vous avez toujours besoin de toutes les entrées utilisateurs, vous pouvez toujours obtenir le reste dans le tampon d'entrée. La manière "char c = scanner.next().charAt(0);" prend le caractère mais efface le tampon. 

// 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);
        }
    }
}  

J'espère que cela vous aidera et bonne chance! P.S. Désolé, je sais que c'est un article plus ancien, mais j'espère que ma réponse apportera de nouvelles idées et pourrait aider d'autres personnes qui ont également ce problème. 

2
brayden Prestwich

La meilleure façon de saisir un caractère dans la classe Scanner est la suivante:

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

Il existe deux approches, vous pouvez soit prendre exactement un caractère ou strictement un caractère. Lorsque vous utilisez exactement, le lecteur ne prendra que le premier caractère, quel que soit le nombre de caractères que vous avez saisis.

Par exemple:

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());  

        }



    }  

}  

Lorsque vous donnez un ensemble de caractères en entrée, dites "abcd", le lecteur ne considérera que le premier caractère, c'est-à-dire la lettre "a"

Mais lorsque vous utilisez strictement, l'entrée ne doit comporter qu'un seul caractère. Si la saisie comporte plus d'un caractère, le lecteur ne l'utilisera pas.

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());  

        }



    }  

}  

Supposons que vous donniez l'entrée "abcd", aucune entrée n'est prise et la variable c aura la valeur Null.

1
Omkar hiremath

Vous devez utiliser votre lecteur d’entrée personnalisé pour obtenir des résultats plus rapides au lieu d’extraire le premier caractère de la chaîne. Lien pour Custom ScanReader et explication: https://Gist.github.com/nik1010/5a90fa43399c539bb817069a14c3c5a8

Code pour numériser Char: 

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);

    }
}

Pour obtenir un seul caractère, 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

Vous devez obtenir la chaîne à l'aide de scanner.next () et appeler la méthode String.charAt (0) sur la chaîne renvoyée.
Exemple:  

    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);
            }


        }

sortie 

Enter a character: 
a
You have entered: a
0
AbdoCosmos

Essayez ceci: char c = S.nextLine (). CharAt (0);

0
Harshal Mande