Prendi un input di caratteri dallo Scanner


124

Sto cercando di trovare un modo per ricevere un charinput dalla tastiera.

Ho provato a usare:

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

Questo metodo non esiste.

Ho provato a prendere ccome file String. Tuttavia, non funzionerebbe sempre in ogni caso, poiché l'altro metodo che sto chiamando dal mio metodo richiede a charcome input. Quindi devo trovare un modo per prendere esplicitamente un carattere come input.

Qualsiasi aiuto?

Risposte:


159

Puoi prendere il primo carattere da Scanner.next:

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

Per consumare esattamente un personaggio potresti usare:

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

Per consumare rigorosamente un carattere potresti usare:

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


7
In realtà sta prendendo più di un personaggio, ma agisce solo sul primo personaggio
Ralph

1
@ user1804697 per consumare solo l'uso dei caratterichar c = reader.next("[a-zA-Z]").charAt(0);
Reimeus

10
Qual è la differenza tra "esattamente" e "rigorosamente" in questo contesto?

2
@ Reimeus qual è esattamente il valore nel copiare il codice e poi eseguirlo?
bharal

54

Imposta scanner:

reader.useDelimiter("");

Dopo questo reader.next()restituirà una stringa di un solo carattere.


17

Non esiste un metodo API per ottenere un personaggio dallo Scanner. Dovresti ottenere la stringa usando scanner.next()e invocare il String.charAt(0)metodo sulla stringa restituita.

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

Per sicurezza con gli spazi bianchi, potresti anche chiamare prima trim()la stringa per rimuovere eventuali spazi bianchi.

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

Non ti reader.next()darebbe già la stringa a partire dal primo carattere non bianco?
norok2

12

Esistono tre modi per affrontare questo problema:

  • Chiama next()lo Scanner ed estrai il primo carattere della Stringa (es. charAt(0)) Se vuoi leggere il resto della riga come caratteri, ripeti i caratteri rimanenti nella Stringa. Altre risposte hanno questo codice.

  • Utilizzare setDelimiter("")per impostare il delimitatore su una stringa vuota. Ciò causerà la next()tokenizzazione in stringhe lunghe esattamente un carattere. Quindi puoi ripetutamente chiamarenext().charAt(0) per iterare i personaggi. È quindi possibile impostare il delimitatore sul valore originale e riprendere la scansione in modo normale!

  • Utilizza l'API Reader invece dell'API Scanner. Il Reader.read()metodo fornisce un singolo carattere letto dal flusso di input. Per esempio:

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

Quando si legge dalla console tramite System.in, l'input viene generalmente memorizzato nel buffer dal sistema operativo e solo "rilasciato" all'applicazione quando l'utente digita INVIO. Quindi, se intendi che la tua applicazione risponda ai singoli colpi della tastiera, questo non funzionerà. È necessario eseguire alcune operazioni di codice nativo specifiche del sistema operativo per disattivare o aggirare il buffer di riga per la console a livello di sistema operativo.

Riferimento:


Per favore, potresti fare un esempio per quello che hai detto
Ralph

4

Puoi risolvere questo problema, "prendere l'input da tastiera un carattere alla volta" in modo molto semplice. Senza dover utilizzare uno Scanner tutto e anche senza cancellare il buffer di input come effetto collaterale, utilizzando questo.

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

Se tutto ciò di cui hai bisogno è la stessa funzionalità della funzione "getChar ()" del linguaggio C, allora funzionerà benissimo. Il grande vantaggio di "System.in.read ()" è che il buffer non viene cancellato dopo ogni carattere che si prende. Quindi, se hai ancora bisogno di tutti gli input degli utenti, puoi comunque ottenere il resto dal buffer di input. Il "char c = scanner.next().charAt(0);"modo in cui afferra il carattere ma cancella il buffer.

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

Spero sia utile e buona fortuna! PS Scusa, so che questo è un post precedente, ma spero che la mia risposta porti nuove intuizioni e possa aiutare altre persone che hanno anche questo problema.


3

Questo in realtà non funziona:

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

Ci sono alcune buone spiegazioni e riferimenti in questa domanda: Perché la classe Scanner non ha un metodo nextChar? "Uno Scanner suddivide il suo input in token utilizzando un pattern delimitatore", che è piuttosto aperto. Ad esempio quando si utilizza questo

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

per questa riga di input "(1 + 9) / (3 - 1) + 6 - 2" la chiamata al prossimo ritorna "(1", c sarà impostato su '(', e finirai per perdere il ' 1 'alla prossima chiamata a next ()

In genere, quando si desidera ottenere un carattere, si desidera ignorare gli spazi bianchi. Questo ha funzionato per me:

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

Riferimento: regex per abbinare un singolo carattere che è tutt'altro che uno spazio


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

2

Il modo migliore per ricevere l'input di un carattere nella classe Scanner è:

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

Dovresti usare il tuo lettore di input personalizzato per risultati più rapidi invece di estrarre il primo carattere dalla lettura di String. Link per ScanReader personalizzato e spiegazione: https://gist.github.com/nik1010/5a90fa43399c539bb817069a14c3c5a8

Codice per la scansione di Char:

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

Dovresti aggiungere il codice dall'essenza nella tua risposta in quanto potrebbe non essere disponibile per un po 'di tempo.
Markus

@Markus aggiunto per la scansione del carattere.
NIKUNJ KHOKHAR

1

Ci sono due approcci, puoi prendere esattamente un carattere o rigorosamente un carattere. Quando usi esattamente, il lettore prenderà solo il primo carattere, indipendentemente dal numero di caratteri immessi.

Per esempio:

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

        }



    }  

}  

Quando fornisci una serie di caratteri come input, dì "abcd", il lettore considererà solo il primo carattere cioè la lettera 'a'

Ma quando usi rigorosamente, l'input dovrebbe essere solo un carattere. Se l'input è composto da più di un carattere, il lettore non accetterà l'input

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

        }



    }  

}  

Supponiamo di dare input "abcd", nessun input viene preso e la variabile c avrà valore Null.


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

    }
}

Per ottenere un solo carattere char c = reader.next ("."). CharAt (0);


Per ottenere un solo carattere 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

Dovresti ottenere la stringa utilizzando scanner.next () e invocare il metodo String.charAt (0) sulla stringa restituita.
Esempio:

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


        }

produzione

Enter a character: 
a
You have entered: a

0

devi solo scrivere questo per ottenere il valore in char type.

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

Prova questo

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

A proposito, non puoi prendere un carattere direttamente come input. Come puoi vedere sopra, viene prima presa una stringa, quindi charAt (0); viene trovato e memorizzato


-1

Basta usare ...

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

Ottiene il primo carattere dell'input successivo.


-2

Potresti usare il typecasting:

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

In questo modo prenderai l'input in String a causa della funzione 'next ()' ma poi verrà convertito in carattere a causa del 'char' menzionato tra parentesi.

Questo metodo di conversione del tipo di dati menzionando il tipo di dati di destinazione tra parentesi è chiamato typecating. Funziona per me, spero che funzioni per te :)


Non puoi typecast da a Stringa a char.
Stephen C

-3

Per trovare l'indice di un carattere in una data puntura, puoi usare questo codice:

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

Il modo più semplice è cambiare prima la variabile in una stringa e accettare l'input come una stringa. Quindi puoi controllare in base alla variabile di input con un'istruzione if-else o switch come segue.

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>
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.