Lấy đầu vào ký tự từ Máy quét


124

Tôi đang cố gắng tìm cách lấy chardữ liệu nhập từ bàn phím.

Tôi đã thử sử dụng:

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

Phương pháp này không tồn tại.

Tôi đã thử coi cnhư là một String. Tuy nhiên, nó sẽ không phải lúc nào cũng hoạt động trong mọi trường hợp, vì phương thức khác mà tôi đang gọi từ phương thức của mình yêu cầu một charđầu vào. Do đó, tôi phải tìm cách lấy một char làm đầu vào một cách rõ ràng.

Bất kỳ giúp đỡ?

Câu trả lời:


159

Bạn có thể lấy ký tự đầu tiên từ Scanner.next:

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

Để sử dụng chính xác một ký tự, bạn có thể sử dụng:

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

Để sử dụng đúng một ký tự, bạn có thể sử dụng:

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


7
Trên thực tế nó dùng nhiều hơn một nhân vật, nhưng chỉ tác động lên nhân vật đầu tiên
Ralph

1
@ user1804697 để chỉ sử dụng ký tựchar c = reader.next("[a-zA-Z]").charAt(0);
Reimeus

10
Sự khác biệt giữa "chính xác" và "nghiêm ngặt" trong ngữ cảnh này là gì?

2
@Reimeus chính xác giá trị trong sao chép mã dán và sau đó chạy nó là gì?
bharal

54

Thiết lập máy quét:

reader.useDelimiter("");

Sau đó reader.next()sẽ trả về một chuỗi ký tự đơn.


17

Không có phương thức API nào để lấy một ký tự từ Máy quét. Bạn sẽ nhận được chuỗi bằng cách sử dụng scanner.next()và gọi String.charAt(0)phương thức trên Chuỗi được trả về.

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

Để an toàn với khoảng trắng, trước tiên, bạn cũng có thể gọi trim()trên chuỗi để xóa bất kỳ khoảng trắng nào.

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

Đã không reader.next()cung cấp cho bạn chuỗi bắt đầu từ ký tự không phải màu trắng đầu tiên?
norok2

12

Có ba cách để tiếp cận vấn đề này:

  • Gọi next()trên Máy quét, và trích xuất ký tự đầu tiên của Chuỗi (ví dụ charAt(0)) Nếu bạn muốn đọc phần còn lại của dòng dưới dạng ký tự, hãy lặp lại các ký tự còn lại trong Chuỗi. Các câu trả lời khác có mã này.

  • Sử dụng setDelimiter("")để đặt dấu phân cách thành một chuỗi trống. Điều này sẽ gây ra next()mã hóa thành các chuỗi dài chính xác một ký tự. Vì vậy, sau đó bạn có thể liên tục gọi next().charAt(0)để lặp các nhân vật. Sau đó, bạn có thể đặt dấu phân cách thành giá trị ban đầu và tiếp tục quét theo cách bình thường!

  • Sử dụng API trình đọc thay vì API trình quét. Các Reader.read()phương pháp mang lại một nhân vật duy nhất đọc từ input stream. Ví dụ:

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

Khi bạn đọc từ bảng điều khiển thông qua System.in, đầu vào thường được hệ điều hành lưu vào bộ đệm và chỉ được "phát hành" vào ứng dụng khi người dùng nhập ENTER. Vì vậy, nếu bạn có ý định ứng dụng của mình phản hồi các lần gõ bàn phím riêng lẻ, điều này sẽ không hoạt động. Bạn sẽ cần thực hiện một số nội dung mã gốc dành riêng cho hệ điều hành để tắt hoặc giải quyết vấn đề đệm dòng cho bảng điều khiển ở cấp hệ điều hành.

Tài liệu tham khảo:


Vui lòng đưa ra một ví dụ cho những gì bạn đã nói
Ralph

4

Bạn có thể giải quyết vấn đề này, "lấy từng ký tự nhập trên bàn phím" rất đơn giản. Không cần phải sử dụng Máy quét tất cả và cũng không xóa bộ đệm đầu vào như một tác dụng phụ, bằng cách sử dụng điều này.

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

Nếu tất cả những gì bạn cần là chức năng giống như chức năng "getChar ()" của ngôn ngữ C thì điều này sẽ hoạt động tốt. Ưu điểm lớn của "System.in.read ()" là bộ đệm không bị xóa sau mỗi lần lấy char của bạn. Vì vậy, nếu bạn vẫn cần tất cả dữ liệu người dùng nhập, bạn vẫn có thể lấy phần còn lại của nó từ bộ đệm đầu vào. Các "char c = scanner.next().charAt(0);"cách làm lấy các char nhưng sẽ xóa bộ đệm.

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

Hy vọng điều này hữu ích và chúc may mắn! Tái bút Xin lỗi, tôi biết đây là một bài viết cũ hơn, nhưng tôi hy vọng rằng câu trả lời của tôi mang lại cái nhìn sâu sắc mới và có thể giúp những người khác cũng gặp vấn đề này.


3

Điều này thực sự không hoạt động:

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

Có một số giải thích và tài liệu tham khảo tốt cho câu hỏi này: Tại sao lớp Scanner không có phương thức nextChar? "Máy quét chia đầu vào của nó thành các mã thông báo bằng cách sử dụng mẫu dấu phân cách", kết thúc khá mở. Ví dụ khi sử dụng cái này

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

đối với dòng đầu vào này "(1 + 9) / (3 - 1) + 6 - 2" lệnh gọi trả về tiếp theo "(1", c sẽ được đặt thành '(', và bạn sẽ mất dấu ' 1 'trong lần gọi tiếp theo tới next ()

Thông thường, khi bạn muốn lấy một ký tự, bạn muốn bỏ qua khoảng trắng. Điều này đã làm việc cho tôi:

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

Tham khảo: regex để khớp với một ký tự duy nhất là bất kỳ ký tự nào ngoại trừ khoảng trắng


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

2

Cách tốt nhất để nhận đầu vào của một ký tự trong lớp Máy quét là:

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

Bạn nên sử dụng trình đọc đầu vào tùy chỉnh của mình để có kết quả nhanh hơn thay vì trích xuất ký tự đầu tiên từ việc đọc Chuỗi. Liên kết cho Custom ScanReader và giải thích: https://gist.github.com/nik1010/5a90fa43399c539bb817069a14c3c5a8

Mã quét Char:

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

Bạn nên thêm mã từ ý chính trong câu trả lời của mình vì nó có thể không khả dụng một lúc nào đó.
Markus

@Markus được thêm vào để quét ký tự.
NIKUNJ KHOKHAR

1

Có hai cách tiếp cận, bạn có thể lấy chính xác một ký tự hoặc hoàn toàn một ký tự. Khi bạn sử dụng chính xác, người đọc sẽ chỉ lấy ký tự đầu tiên, bất kể bạn nhập bao nhiêu ký tự.

Ví dụ:

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

        }



    }  

}  

Khi bạn cung cấp một nhóm ký tự làm đầu vào, nói "abcd", người đọc sẽ chỉ xem xét ký tự đầu tiên, tức là ký tự 'a'

Nhưng khi bạn sử dụng nghiêm ngặt, đầu vào chỉ nên là một ký tự. Nếu đầu vào nhiều hơn một ký tự, thì người đọc sẽ không nhận đầu vào

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

        }



    }  

}  

Giả sử bạn cung cấp đầu vào "abcd", không có đầu vào nào được sử dụng và biến c sẽ có giá trị 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);

    }
}

Để chỉ lấy một ký tự char c = reader.next ("."). CharAt (0);


Để chỉ lấy một ký tự 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

Bạn sẽ nhận được Chuỗi bằng cách sử dụng scanner.next () và gọi phương thức String.charAt (0) trên Chuỗi được trả về.
Thực hiện:

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


        }

đầu ra

Enter a character: 
a
You have entered: a

0

bạn chỉ cần viết điều này để nhận giá trị trong kiểu 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

Thử cái này

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

Nhân tiện, bạn không thể lấy một ký tự trực tiếp làm đầu vào. Như bạn có thể thấy ở trên, một Chuỗi được lấy đầu tiên sau đó là charAt (0); được tìm thấy và lưu trữ


-1

Chỉ dùng...

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

Điều này nhận được ký tự đầu tiên của đầu vào tiếp theo.


-2

Bạn có thể sử dụng cách đánh máy:

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

Bằng cách này, bạn sẽ lấy đầu vào trong Chuỗi do hàm 'next ()' nhưng sau đó nó sẽ được chuyển đổi thành ký tự do 'char' được đề cập trong dấu ngoặc.

Phương pháp chuyển đổi kiểu dữ liệu này bằng cách đề cập đến kiểu dữ liệu đích trong ngoặc được gọi là định kiểu. Nó hiệu quả với tôi, tôi hy vọng nó hiệu quả với bạn :)


Bạn không thể nhập từ a Stringđến a char.
Stephen C

-3

Để tìm chỉ số của một ký tự trong một stt nhất định, bạn có thể sử dụng mã này:

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

Cách dễ nhất là trước tiên hãy thay đổi biến thành Chuỗi và chấp nhận đầu vào là một chuỗi. Sau đó, bạn có thể kiểm soát dựa trên biến đầu vào bằng câu lệnh if-else hoặc switch như sau.

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>
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.