Ambil masukan karakter dari Scanner


124

Saya mencoba mencari cara untuk menerima charmasukan dari keyboard.

Saya mencoba menggunakan:

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

Metode ini tidak ada.

Saya mencoba mengambil csebagai String. Namun, itu tidak selalu berhasil dalam setiap kasus, karena metode lain yang saya panggil dari metode saya memerlukan a charsebagai masukan. Oleh karena itu saya harus menemukan cara untuk secara eksplisit mengambil karakter sebagai masukan.

Ada bantuan?

Jawaban:


159

Anda dapat mengambil karakter pertama dari Scanner.next:

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

Untuk mengonsumsi tepat satu karakter yang dapat Anda gunakan:

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

Untuk mengkonsumsi ketat satu karakter Anda bisa menggunakan:

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


7
Sebenarnya ini mengambil lebih dari satu karakter, tetapi bertindak hanya pada karakter pertama
Ralph

1
@ pengguna1804697 untuk mengkonsumsi hanya penggunaan karakterchar c = reader.next("[a-zA-Z]").charAt(0);
Reimeus

10
Apa perbedaan antara "tepat" dan "ketat" dalam konteks ini?

2
@Reimeus apa sebenarnya nilai dalam menyalin kode tempel dan kemudian menjalankannya?
bharal

54

Siapkan pemindai:

reader.useDelimiter("");

Setelah ini reader.next()akan mengembalikan string satu karakter.


17

Tidak ada metode API untuk mendapatkan karakter dari Scanner. Anda harus mendapatkan String menggunakan scanner.next()dan memanggil String.charAt(0)metode pada String yang dikembalikan.

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

Untuk amannya dengan spasi, Anda juga dapat memanggil trim()string terlebih dahulu untuk menghapus spasi putih.

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

Bukankah reader.next()sudah memberi Anda string mulai dari karakter non-putih pertama?
norok2

12

Ada tiga cara untuk mengatasi masalah ini:

  • Panggil next()Pemindai, dan ekstrak karakter pertama dari String (mis. charAt(0)) Jika Anda ingin membaca sisa baris sebagai karakter, ulangi karakter yang tersisa dalam String. Jawaban lain memiliki kode ini.

  • Gunakan setDelimiter("")untuk menyetel pemisah menjadi string kosong. Ini akan menyebabkan next()tokenisasi menjadi string yang panjangnya persis satu karakter. Jadi Anda dapat berulang kali memanggil next().charAt(0)untuk mengulang karakter. Anda kemudian dapat menyetel pembatas ke nilai aslinya dan melanjutkan pemindaian dengan cara biasa!

  • Gunakan API Pembaca, bukan API Pemindai. The Reader.read()Metode memberikan satu karakter dibaca dari input stream. Sebagai contoh:

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

Saat Anda membaca dari konsol melalui System.in, input biasanya di-buffer oleh sistem operasi, dan hanya "dilepaskan" ke aplikasi saat pengguna mengetik ENTER. Jadi, jika Anda bermaksud agar aplikasi Anda merespons setiap ketikan keyboard, ini tidak akan berhasil. Anda perlu melakukan beberapa kode asli khusus OS untuk menonaktifkan atau mengatasi buffering baris untuk konsol di tingkat OS.

Referensi:


Tolong bisakah Anda memberikan contoh untuk apa yang Anda katakan
Ralph

4

Anda dapat mengatasi masalah ini, "mengambil input keyboard satu karakter pada satu waktu" dengan sangat mudah. Tanpa harus menggunakan Scanner semua dan juga tidak menghapus buffer input sebagai efek sampingnya, dengan menggunakan ini.

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

Jika semua yang Anda butuhkan adalah fungsionalitas yang sama dengan fungsi bahasa C "getChar ()" maka ini akan bekerja dengan baik. Keuntungan besar dari "System.in.read ()" adalah buffer tidak dihapus setelah setiap karakter Anda ambil. Jadi, jika Anda masih membutuhkan semua input pengguna, Anda masih bisa mendapatkan sisanya dari buffer input. The "char c = scanner.next().charAt(0);"cara melakukan ambil char tapi akan menghapus penyangga.

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

Semoga bermanfaat, dan semoga berhasil! PS Maaf saya tahu ini adalah posting lama, tapi saya berharap jawaban saya membawa wawasan baru dan dapat membantu orang lain yang juga mengalami masalah ini.


3

Ini sebenarnya tidak berhasil:

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

Ada beberapa penjelasan dan referensi yang bagus dalam pertanyaan ini: Mengapa kelas Scanner tidak memiliki metode nextChar? "Pemindai memecah masukannya menjadi token menggunakan pola pembatas", yang cukup terbuka. Misalnya saat menggunakan ini

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

untuk baris masukan ini "(1 + 9) / (3 - 1) + 6 - 2" panggilan ke pengembalian berikutnya "(1", c akan disetel ke '(', dan Anda akan kehilangan ' 1 'pada panggilan berikutnya ke berikutnya ()

Biasanya ketika Anda ingin mendapatkan karakter, Anda ingin mengabaikan spasi. Ini berhasil untuk saya:

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

Referensi: regex untuk mencocokkan karakter tunggal yang tidak lain adalah spasi


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

2

Cara terbaik untuk menerima input karakter di kelas Scanner adalah:

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

Anda harus menggunakan pembaca masukan kustom Anda untuk hasil yang lebih cepat daripada mengekstrak karakter pertama dari membaca String. Tautan untuk Custom ScanReader dan penjelasannya: https://gist.github.com/nik1010/5a90fa43399c539bb817069a14c3c5a8

Kode untuk memindai Char:

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

Anda harus menambahkan kode dari inti jawaban Anda karena mungkin tidak tersedia beberapa waktu.
Markus

@Markus ditambahkan untuk memindai karakter.
NIKUNJ KHOKHAR

1

Ada dua pendekatan, Anda dapat mengambil tepat satu karakter atau ketat satu karakter. Saat Anda menggunakan persis, pembaca hanya akan mengambil karakter pertama, terlepas dari berapa banyak karakter yang Anda masukkan.

Sebagai contoh:

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

        }



    }  

}  

Ketika Anda memberikan sekumpulan karakter sebagai masukan, katakan "abcd", pembaca hanya akan mempertimbangkan karakter pertama yaitu, huruf 'a'

Tetapi ketika Anda menggunakan secara ketat, masukan harus hanya satu karakter. Jika masukan lebih dari satu karakter, maka pembaca tidak akan mengambil masukan tersebut

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

        }



    }  

}  

Misalkan Anda memberi input "abcd", tidak ada input yang diambil, dan variabel c akan memiliki nilai 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);

    }
}

Untuk mendapatkan hanya satu karakter char c = reader.next ("."). CharAt (0);


Untuk mendapatkan hanya satu karakter 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

Anda harus mendapatkan String menggunakan scanner.next () dan memanggil metode String.charAt (0) pada String yang dikembalikan.
Contoh:

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


        }

keluaran

Enter a character: 
a
You have entered: a

0

Anda hanya perlu menulis ini untuk mendapatkan nilai dalam tipe karakter.

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

Coba ini

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

Omong-omong, Anda tidak bisa mengambil karakter secara langsung sebagai masukan. Seperti yang Anda lihat di atas, pertama-tama String diambil kemudian charAt (0); ditemukan dan disimpan


-1

Gunakan saja ...

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

Ini mendapatkan karakter pertama dari input berikutnya.


-2

Anda bisa menggunakan typecasting:

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

Dengan cara ini Anda akan mengambil input dalam String karena fungsi 'next ()' tetapi kemudian akan diubah menjadi karakter karena 'char' yang disebutkan dalam tanda kurung.

Metode konversi tipe data dengan menyebutkan tipe data tujuan dalam tanda kurung disebut typecating. Ini berhasil untuk saya, saya harap ini berhasil untuk Anda :)


Anda tidak dapat mengetikkan a Stringke a char.
Stephen C

-3

Untuk menemukan indeks karakter dalam sengatan tertentu, Anda dapat menggunakan kode ini:

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

Cara termudah adalah, pertama ubah variabel menjadi String dan terima input sebagai string. Kemudian Anda dapat mengontrol berdasarkan variabel input dengan pernyataan if-else atau switch sebagai berikut.

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>
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.