143 votes

Prendre une entrée char du Scanner

J'essaye de trouver un moyen de prendre un char entrée par le 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 en tant que String . Pourtant, cela ne fonctionnerait pas dans tous les cas, puisque l'autre méthode que j'appelle à partir de ma méthode nécessite un char comme entrée. Je dois donc trouver un moyen de prendre explicitement un caractère en entrée.

Une aide ?

186voto

Reimeus Points 93429

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

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

Pour consommer exactement un personnage que vous pourriez utiliser :

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

Pour consommer strictement un personnage que vous pourriez utiliser :

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

67voto

hoat4 Points 894

Configurer le scanner :

reader.useDelimiter("");

Après cette reader.next() retournera une chaîne à un seul caractère.

19voto

PermGenError Points 26936

Il n'existe pas de méthode API pour obtenir un caractère du scanner. Vous devez obtenir la chaîne en utilisant scanner.next() et invoquer String.charAt(0) 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 aussi appeler d'abord trim() sur la chaîne de caractères pour supprimer les espaces.

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

19voto

Stephen C Points 255558

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

  • Appelez next() sur le scanner, et extraire le premier caractère de la chaîne (par ex. charAt(0) ) Si vous voulez lire le reste de la ligne en tant que caractères, itérez sur les caractères restants dans la chaîne. D'autres réponses ont ce code.

  • Utilisez setDelimiter("") pour définir le délimiteur comme une chaîne vide. Cela aura pour effet de next() pour les transformer en chaînes de caractères d'exactement un caractère. Ainsi, vous pouvez à plusieurs reprises appelez next().charAt(0) pour itérer les caractères. Vous pouvez ensuite remettre le délimiteur à sa valeur d'origine et reprendre la numérisation de manière normale !

  • Utilisez l'API de lecteur au lieu de l'API de scanner. Le site 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 depuis la console via System.in En effet, l'entrée est généralement mise en mémoire tampon par le système d'exploitation, et n'est "libérée" pour l'application que lorsque l'utilisateur tape ENTER. Donc, si vous voulez que votre application réponde à des frappes de clavier individuelles, cela ne fonctionnera pas. Vous devrez utiliser du code natif spécifique au système d'exploitation pour désactiver ou contourner la mise en mémoire tampon des lignes de la console au niveau du système d'exploitation.

Référence :

4voto

gary69 Points 477

En fait, ça ne marche pas :

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

Il y a de 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 son entrée en jetons en utilisant un motif de délimitation", ce qui est assez ouvert. Par exemple, en utilisant ce

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

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

En général, lorsque vous souhaitez obtenir un caractère, vous souhaitez ignorer les espaces blancs. Ceci a fonctionné pour moi :

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

Référence : regex pour correspondre à un caractère unique qui n'est pas un espace

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X