Pobierz znak ze skanera


124

Próbuję znaleźć sposób na pobranie chardanych wejściowych z klawiatury.

Próbowałem użyć:

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

Ta metoda nie istnieje.

Próbowałem wziąć cjako String. Jednak nie zawsze będzie działać w każdym przypadku, ponieważ inna metoda, którą wywołuję z mojej metody, wymaga a charjako danych wejściowych. Dlatego muszę znaleźć sposób, aby jawnie przyjąć znak jako dane wejściowe.

Jakaś pomoc?

Odpowiedzi:


159

Możesz wziąć pierwszą postać z Scanner.next:

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

Aby skonsumować dokładnie jedną postać, której możesz użyć:

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

Aby skonsumować tylko jedną postać, możesz użyć:

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


7
Właściwie to zajmuje więcej niż jedną postać, ale działa tylko na pierwszej postaci
Ralph

1
@ user1804697, aby zużywać tylko znaki, użyjchar c = reader.next("[a-zA-Z]").charAt(0);
Reimeus

10
Jaka jest różnica między „dokładnie” a „ściśle” w tym kontekście?

2
@Reimeus jaka dokładnie jest wartość w kopiowaniu, wklejaniu kodu i uruchamianiu go?
bharal

54

Konfiguracja skanera:

reader.useDelimiter("");

Po tym reader.next()zwróci ciąg jednoznakowy.


17

Nie ma metody API, aby pobrać znak ze skanera. Powinieneś pobrać String używając scanner.next()i wywołać String.charAt(0)metodę na zwróconym String.

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

Aby być bezpiecznym z białymi znakami, możesz również najpierw wywołać trim()łańcuch, aby usunąć wszelkie białe znaki.

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

Czy nie reader.next()dałby ci już ciągu zaczynającego się od pierwszego niebiałego znaku?
norok2

12

Istnieją trzy sposoby rozwiązania tego problemu:

  • Wywołaj next()skaner i wyodrębnij pierwszy znak ciągu (np. charAt(0)) Jeśli chcesz odczytać resztę wiersza jako znaki, wykonaj iterację po pozostałych znakach ciągu. Inne odpowiedzi mają ten kod.

  • Służy setDelimiter("")do ustawiania separatora na pusty ciąg. Spowoduje to next()tokenizację w łańcuchy o długości dokładnie jednego znaku. Więc możesz wielokrotnie wywoływać, next().charAt(0)aby iterować znaki. Następnie możesz ustawić ogranicznik na jego oryginalną wartość i wznowić skanowanie w normalny sposób!

  • Użyj interfejsu API czytnika zamiast interfejsu API skanera. Reader.read()Metoda dostarcza pojedynczy znak odczytany ze strumienia wejściowego. Na przykład:

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

Podczas czytania z konsoli za pośrednictwem System.in, dane wejściowe są zwykle buforowane przez system operacyjny i „zwalniane” do aplikacji tylko wtedy, gdy użytkownik wpisze ENTER. Jeśli więc chcesz, aby Twoja aplikacja reagowała na poszczególne naciśnięcia klawisza, to nie zadziała. Będziesz musiał zrobić coś specyficznego dla systemu operacyjnego, aby wyłączyć lub obejść buforowanie linii dla konsoli na poziomie systemu operacyjnego.

Odniesienie:


Czy mógłbyś podać przykład tego, co powiedziałeś
Ralph,

4

Możesz rozwiązać ten problem, polegający na „przechwytywaniu danych wejściowych z klawiatury po jednym znaku na raz” w bardzo prosty sposób. Bez konieczności używania skanera all, a także bez czyszczenia bufora wejściowego jako efektu ubocznego, używając tego.

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

Jeśli potrzebujesz tylko tej samej funkcjonalności, co funkcja „getChar ()” języka C, to będzie działać świetnie. Dużą zaletą "System.in.read ()" jest to, że bufor nie jest czyszczony po każdym znaku, który przechwycisz. Więc jeśli nadal potrzebujesz danych wejściowych wszystkich użytkowników, nadal możesz pobrać resztę z bufora wejściowego. "char c = scanner.next().charAt(0);"Sposób robi chwycić char ale będzie wyczyścić bufor.

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

Mam nadzieję, że to pomocne i powodzenia! PS Przepraszam, wiem, że to starszy post, ale mam nadzieję, że moja odpowiedź przyniesie nowy wgląd i może pomóc innym osobom, które również mają ten problem.


3

To faktycznie nie działa:

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

Istnieje kilka dobrych wyjaśnień i odniesień w tym pytaniu: Dlaczego klasa Scanner nie ma metody nextChar? „Skaner rozbija swoje dane wejściowe na tokeny za pomocą wzorca separatora”, który jest dość otwarty. Na przykład podczas korzystania z this

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

dla tego wiersza wejścia "(1 + 9) / (3 - 1) + 6 - 2" wywołanie next zwraca "(1", c zostanie ustawione na '(', a skończysz na utracie ' 1 'przy następnym wywołaniu do next ()

Zazwyczaj, gdy chcesz uzyskać znak, chciałbyś zignorować białe spacje. To zadziałało dla mnie:

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

Odniesienie: wyrażenie regularne do dopasowania pojedynczego znaku, który jest czymś innym niż spacją


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

2

Najlepszym sposobem na wprowadzenie znaku w klasie Scanner jest:

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

Aby uzyskać szybsze wyniki, należy użyć własnego czytnika wejściowego zamiast wyodrębniania pierwszego znaku z czytania ciągu. Link do Custom ScanReader i wyjaśnienie: https://gist.github.com/nik1010/5a90fa43399c539bb817069a14c3c5a8

Kod do skanowania Char:

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

Powinieneś dodać kod z treści w swojej odpowiedzi, ponieważ może być on niedostępny przez jakiś czas.
Markus

@Markus dodany do skanowania char.
NIKUNJ KHOKHAR

1

Istnieją dwa podejścia, możesz wziąć dokładnie jedną postać lub tylko jedną postać. Jeśli użyjesz dokładnie, czytnik przyjmie tylko pierwszy znak, niezależnie od tego, ile znaków wprowadzisz.

Na przykład:

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

        }



    }  

}  

Kiedy podasz zestaw znaków jako dane wejściowe, powiedz „abcd”, czytelnik weźmie pod uwagę tylko pierwszy znak, tj. Literę „a”

Ale jeśli używasz ściśle, dane wejściowe powinny mieć tylko jeden znak. Jeśli na wejściu jest więcej niż jeden znak, czytnik nie weźmie wejścia

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

        }



    }  

}  

Załóżmy, że podajesz dane wejściowe „abcd”, żadne dane wejściowe nie są pobierane, a zmienna c będzie miała wartość 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);

    }
}

Aby uzyskać tylko jeden znak char c = reader.next ("."). CharAt (0);


Aby uzyskać tylko jeden znak 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

Powinieneś pobrać String używając scanner.next () i wywołać metodę String.charAt (0) na zwróconym Stringu.
Przykład:

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


        }

wynik

Enter a character: 
a
You have entered: a

0

po prostu musisz to napisać, aby uzyskać wartość typu 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

Spróbuj tego

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

Nawiasem mówiąc, nie możesz wziąć znaku bezpośrednio jako wejścia. Jak widać powyżej, najpierw pobierany jest String, a następnie charAt (0); zostanie znalezione i zapisane


-1

Po prostu użyj...

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

To pobiera pierwszy znak następnego wejścia.


-2

Możesz użyć rzutowania typów:

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

W ten sposób weźmiesz dane wejściowe w ciągu znaków ze względu na funkcję „next ()”, ale zostaną one zamienione na znaki ze względu na „znak” wymieniony w nawiasach.

Ta metoda konwersji typu danych poprzez podanie docelowego typu danych w nawiasach nosi nazwę typecating. U mnie to działa, mam nadzieję, że u ciebie działa :)


Nie możesz typecast a Stringdo a char.
Stephen C

-3

Aby znaleźć indeks znaku w danym żądle, możesz użyć tego kodu:

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

Najłatwiej jest najpierw zmienić zmienną na String i zaakceptować dane wejściowe jako łańcuch. Następnie można sterować na podstawie zmiennej wejściowej za pomocą instrukcji if-else lub switch w następujący sposób.

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>
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.