Tome una entrada de caracteres del escáner


124

Estoy tratando de encontrar una manera de tomar una charentrada desde el teclado.

Intenté usar:

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

Este método no existe.

Traté de tomar ccomo un String. Sin embargo, no siempre funcionaría en todos los casos, ya que el otro método al que llamo desde mi método requiere charuna entrada. Por lo tanto, tengo que encontrar una manera de tomar explícitamente un char como entrada.

¿Alguna ayuda?

Respuestas:


159

Puedes tomar el primer personaje de Scanner.next:

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

Para consumir exactamente un personaje que podrías usar:

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

Para consumir estrictamente un personaje que podría usar:

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


77
En realidad, toma más de un personaje, pero actúa solo en el primer personaje
Ralph el

1
@ user1804697 para consumir solo el uso de caractereschar c = reader.next("[a-zA-Z]").charAt(0);
Reimeus

10
¿Cuál es la diferencia entre "exactamente" y "estrictamente" en este contexto?

2
@Reimeus, ¿cuál es exactamente el valor en copiar y pegar código y luego ejecutarlo?
bharal

53

Configurar escáner:

reader.useDelimiter("");

Después de esto reader.next(), devolverá una cadena de un solo carácter.


17

No hay un método API para obtener un personaje del escáner. Debería obtener el String usando scanner.next()e invocar el String.charAt(0)método en el String devuelto.

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

Solo para estar seguro con espacios en blanco, también puede llamar primero trim()a la cadena para eliminar los espacios en blanco.

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

¿ reader.next()Ya no le daría la secuencia a partir del primer carácter no blanco?
norok2

12

Hay tres formas de abordar este problema:

  • Llame next()al escáner y extraiga el primer carácter de la cadena (por ejemplo charAt(0)). Si desea leer el resto de la línea como caracteres, repita los caracteres restantes en la cadena. Otras respuestas tienen este código.

  • Use setDelimiter("")para establecer el delimitador en una cadena vacía. Esto hará next()que se tokenice en cadenas que tengan exactamente un carácter de largo. Entonces puede llamar repetidamentenext().charAt(0) para iterar los caracteres. ¡Luego puede establecer el delimitador en su valor original y reanudar el escaneo de la manera normal!

  • Use la API Reader en lugar de la API Scanner. El Reader.read()método entrega una lectura de un solo carácter de la secuencia de entrada. Por ejemplo:

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

Cuando lees desde la consola a través de System.in , el sistema operativo almacena la entrada en la memoria intermedia y solo se "libera" a la aplicación cuando el usuario escribe ENTER. Entonces, si tiene la intención de que su aplicación responda a golpes de teclado individuales, esto no va a funcionar. Tendría que hacer algunas cosas de código nativo específicas del sistema operativo para desactivar o evitar el almacenamiento en línea para la consola en el nivel del sistema operativo.

Referencia:


¿Podría dar un ejemplo de lo que dijo
Ralph

4

Puede resolver este problema, de "capturar la entrada del teclado de un carácter a la vez" de manera muy simple. Sin tener que usar un escáner todo y tampoco borrar el búfer de entrada como un efecto secundario, al usar esto.

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

Si todo lo que necesita es la misma funcionalidad que la función "getChar ()" del lenguaje C, esto funcionará muy bien. La gran ventaja de "System.in.read ()" es que el búfer no se borra después de cada char su captura. Entonces, si aún necesita toda la entrada de los usuarios, aún puede obtener el resto del búfer de entrada. La "char c = scanner.next().charAt(0);"forma toma el char pero borrará el búfer.

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

Espero que esto sea útil, y buena suerte! PD: Lo siento, sé que esta es una publicación anterior, pero espero que mi respuesta traiga una nueva perspectiva y pueda ayudar a otras personas que también tienen este problema.


3

Esto en realidad no funciona:

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

Hay algunas buenas explicaciones y referencias en esta pregunta: ¿Por qué la clase Scanner no tiene un método nextChar? "Un escáner divide su entrada en tokens usando un patrón delimitador", que es bastante abierto. Por ejemplo cuando se usa esto

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

para esta línea de entrada "(1 + 9) / (3 - 1) + 6 - 2" la llamada al siguiente devuelve "(1", c se establecerá en '(', y terminará perdiendo el ' 1 'en la próxima llamada a next ()

Normalmente, cuando quieres obtener un personaje, te gustaría ignorar los espacios en blanco. Esto funcionó para mí:

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

Referencia: expresiones regulares para que coincida con un solo personaje que es cualquier cosa menos un espacio


FYI"[^\\s]" === "\\S"
Bohemian

2

La mejor manera de tomar la entrada de un personaje en la clase Scanner es:

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

Debe usar su lector de entrada personalizado para obtener resultados más rápidos en lugar de extraer el primer carácter de la lectura de String. Enlace para ScanReader personalizado y explicación: https://gist.github.com/nik1010/5a90fa43399c539bb817069a14c3c5a8

Código para escanear Char:

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

Debe agregar el código de la esencia en su respuesta, ya que podría no estar disponible en algún momento.
Markus

@Markus agregado para escanear char.
NIKUNJ KHOKHAR

1

Hay dos enfoques, puede tomar exactamente un personaje o estrictamente un carácter. Cuando usa exactamente, el lector tomará solo el primer carácter, independientemente de cuántos caracteres ingrese.

Por ejemplo:

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

        }



    }  

}  

Cuando ingresa un conjunto de caracteres como entrada, diga "abcd", el lector considerará solo el primer carácter, es decir, la letra 'a'

Pero cuando se usa estrictamente, la entrada debe ser solo un carácter. Si la entrada tiene más de un carácter, el lector no tomará la entrada.

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

        }



    }  

}  

Suponga que ingresa la entrada "abcd", no se toma ninguna entrada y la variable c tendrá un valor nulo.


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

    }
}

Para obtener solo un carácter char c = reader.next ("."). CharAt (0);


Para obtener solo un carácter 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

Debería obtener el String usando scanner.next () e invocar el método String.charAt (0) en el String devuelto.
Ejemplo:

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


        }

salida

Enter a character: 
a
You have entered: a

0

solo necesita escribir esto para obtener valor en el tipo char.

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

Prueba esto

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

Por cierto, no puedes tomar un char directamente como entrada. Como puede ver arriba, primero se toma una Cadena y luego el CharAt (0); se encuentra y se almacena


-1

Solo usa...

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

Esto obtiene el primer carácter de la siguiente entrada.


-2

Podrías usar la conversión de texto:

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

De esta manera, tomará la entrada en String debido a la función 'next ()' pero luego se convertirá en carácter debido al 'char' mencionado entre paréntesis.

Este método de conversión de tipo de datos al mencionar el tipo de datos de destino entre paréntesis se denomina typecating. Funciona para mí, espero que funcione para ti :)


No se puede escribir de una Stringa una char.
Stephen C

-3

Para encontrar el índice de un personaje en una picadura dada, puede usar este código:

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

La forma más fácil es, primero cambie la variable a una Cadena y acepte la entrada como una cadena. Luego puede controlar en función de la variable de entrada con una instrucción if-else o switch de la siguiente manera.

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>
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.