Prendre une entrée de caractère du scanner

124

J'essaie de trouver un moyen de prendre une charentrée 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 ccomme un String. Pourtant, cela ne fonctionnerait pas toujours dans tous les cas, car l'autre méthode que j'appelle de ma méthode nécessite charune entrée. Par conséquent, je dois trouver un moyen de prendre explicitement un caractère comme entrée.

De l'aide?

Ralph
la source

Réponses:

159

Vous pouvez prendre le premier personnage de Scanner.next:

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

Pour consommer exactement un personnage, vous pouvez utiliser:

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

Pour consommer strictement un caractère, vous pouvez utiliser:

char c = reader.next(".").charAt(0);
Reimeus
la source
7
En fait, il prend plus d'un personnage, mais n'agit que sur le premier personnage
Ralph
1
@ user1804697 pour ne consommer que des caractèreschar c = reader.next("[a-zA-Z]").charAt(0);
Reimeus
10
Quelle est la différence entre «exactement» et «strictement» dans ce contexte?
2
@Reimeus quelle est exactement la valeur de copier-coller du code puis de l'exécuter?
bharal
54

Scanner de configuration:

reader.useDelimiter("");

Après cela reader.next(), une chaîne à un seul caractère sera renvoyée.

hoat4
la source
17

Il n'y a pas de méthode API pour obtenir un personnage du scanner. Vous devez obtenir la chaîne en utilisant scanner.next()et invoquer la String.charAt(0)méthode sur la chaîne retournée.

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

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

Scanner reader = new Scanner(System.in);
char c = reader.next().trim().charAt(0);
PermGenError
la source
Ne reader.next()vous donnerait -il pas déjà la chaîne à partir du premier caractère non blanc?
norok2
12

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

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

  • Utilisez setDelimiter("")pour définir le délimiteur sur une chaîne vide. Cela entraînera la next()création de jetons en chaînes contenant exactement un caractère. Ainsi, vous pouvez appeler à plusieurs reprisesnext().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 normale!

  • Utilisez l'API Reader au lieu de l'API Scanner. La Reader.read()méthode délivre 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 uniquement "libérée" vers l'application lorsque l'utilisateur tape ENTER. Donc, si vous souhaitez que votre application réponde à des frappes de clavier individuelles, cela ne fonctionnera pas. Vous auriez besoin de faire des trucs de code natif spécifiques au système d'exploitation pour désactiver ou contourner la mise en tampon de ligne pour la console au niveau du système d'exploitation.

Référence:

Stephen C
la source
Pourriez-vous donner un exemple de ce que vous avez dit
Ralph
4

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

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 saisie. Donc, si vous avez toujours besoin de toutes les entrées des utilisateurs, vous pouvez toujours obtenir le reste à partir du tampon d'entrée. Le "char c = scanner.next().charAt(0);"chemin saisit 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 sera utile et bonne chance! PS Désolé, je sais que c'est un article plus ancien, mais j'espère que ma réponse apportera de nouvelles perspectives et pourrait aider d'autres personnes qui ont également ce problème.

Brayden Prestwich
la source
3

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 une méthode nextChar? "Un Scanner divise son entrée en jetons en utilisant un modèle de délimiteur", ce qui est assez ouvert. Par exemple lors de l'utilisation de ce

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

pour cette ligne d'entrée "(1 + 9) / (3 - 1) + 6 - 2" l'appel au prochain retourne "(1", c sera mis à '(', et vous finirez par perdre le ' 1 'au prochain appel au suivant ()

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 correspondre à un seul caractère qui est tout sauf un espace

Gary69
la source
FYI"[^\\s]" === "\\S"
Bohemian
2

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

Scanner sca=new Scanner(System.in);
System.out.println("enter a character");
char ch=sca.next().charAt(0);
Sahil Gupta
la source
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");

    }
}
HellPreacher
la source
1

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

Harshal Mande
la source
1

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

Code de numérisation des caractères:

BufferedInputStream br=new BufferedInputStream(System.in);
char a= (char)br.read();
NIKUNJ KHOKHAR
la source
Vous devriez ajouter le code de l'essentiel dans votre réponse car il pourrait être indisponible un certain temps.
Markus
@Markus ajouté pour scanner le caractère.
NIKUNJ KHOKHAR
1

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 saisissez.

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 doit être un seul caractère. Si l'entrée contient plus d'un caractère, le lecteur ne prendra pas l'entrée

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 une entrée "abcd", aucune entrée n'est prise et la variable c aura une valeur Null.

Omkar hiremath
la source
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);

    }
}

Pour obtenir un seul caractère char c = reader.next ("."). CharAt (0);

Rakesh Kumar B
la source
Pour obtenir un seul caractère 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');
}
}
John Born
la source
0

Vous devez obtenir la chaîne en utilisant 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);
            }


        }

production

Enter a character: 
a
You have entered: a
Abderrahmen
la source
0

il vous suffit d'écrire ceci pour obtenir une valeur de type char.

char c = reader.next().charAt(0);
bilal Tashfeen
la source
-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
vishu
la source
-1

Essaye ça

Scanner scanner=new Scanner(System.in);
String s=scanner.next();
char c=s.charAt(0);
Farhan
la source
-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

À propos, vous ne pouvez pas prendre un caractère directement comme entrée. Comme vous pouvez le voir ci-dessus, un String est d'abord pris puis le charAt (0); est trouvé et stocké

Arafe Zawad Sajid
la source
-1

Utilisez simplement ...

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

Cela obtient le premier caractère de l'entrée suivante.

Razoowp
la source
-2

Vous pouvez utiliser le typage:

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

De cette façon, vous prendrez l'entrée dans String en raison de la fonction 'next ()', mais elle sera ensuite convertie en caractère en raison du 'char' mentionné entre parenthèses.

Cette méthode de conversion du type de données en mentionnant le type de données de destination entre parenthèses est appelée typecating. Cela fonctionne pour moi, j'espère que cela fonctionne pour vous :)

Nihaarika
la source
Vous ne pouvez pas typer un Stringen un char.
Stephen C
-3

Pour trouver l'index d'un caractère dans une piqûre donnée, vous pouvez utiliser ce code:

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

    }

}
Robi
la source
-7

Le moyen le plus simple consiste à changer d'abord la variable en chaîne et à accepter l'entrée sous forme de chaîne. Ensuite, vous pouvez contrôler en fonction de la variable d'entrée avec une instruction if-else ou switch comme suit.

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>
}
AndroidShifu
la source