ป้อนถ่านจากเครื่องสแกนเนอร์


124

ฉันพยายามหาวิธีcharป้อนข้อมูลจากแป้นพิมพ์

ฉันลองใช้:

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

ไม่มีวิธีนี้

ฉันลองใช้cเป็นไฟล์String. แต่มันจะไม่ได้ผลเสมอไปในทุกกรณีเนื่องจากวิธีอื่นที่ฉันเรียกจากเมธอดของฉันต้องใช้charเป็นอินพุต ดังนั้นฉันจึงต้องหาวิธีที่จะใช้ถ่านเป็นอินพุตอย่างชัดเจน

ความช่วยเหลือใด ๆ

คำตอบ:


159

คุณสามารถใช้อักขระตัวแรกจากScanner.next:

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

ที่จะบริโภคว่าตัวละครตัวหนึ่งที่คุณสามารถใช้:

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

หากต้องการใช้อักขระหนึ่งตัวอย่างเคร่งครัดคุณสามารถใช้:

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


7
จริงๆแล้วมันมีมากกว่าหนึ่งตัว แต่แสดงเฉพาะในตัวละครตัวแรก
Ralph

1
@ user1804697 เพื่อใช้อักขระเพียงอย่างเดียวchar c = reader.next("[a-zA-Z]").charAt(0);
Reimeus

10
อะไรคือความแตกต่างระหว่าง "ตรงทั้งหมด" และ "เคร่งครัด" ในบริบทนี้

2
@Reimeus ค่าในการคัดลอกวางโค้ดแล้วรันมันคืออะไร?
bharal

54

ตั้งค่าเครื่องสแกน:

reader.useDelimiter("");

หลังจากนี้reader.next()จะส่งคืนสตริงอักขระเดี่ยว


17

ไม่มีวิธี API ในการรับอักขระจากเครื่องสแกน คุณควรได้รับ String โดยใช้scanner.next()และเรียกใช้String.charAt(0)เมธอดบน String ที่ส่งคืน

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

เพื่อความปลอดภัยด้วยช่องว่างคุณสามารถเรียกtrim()ใช้สตริงเพื่อลบช่องว่างก่อนได้

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

คุณยังไม่reader.next()ได้ให้สตริงที่เริ่มต้นจากอักขระที่ไม่ใช่สีขาวตัวแรก?
norok2

12

มีสามวิธีในการแก้ไขปัญหานี้:

  • เรียกnext()ใช้เครื่องสแกนเนอร์และแยกอักขระตัวแรกของ String (เช่นcharAt(0)) หากคุณต้องการอ่านส่วนที่เหลือของบรรทัดเป็นอักขระให้ทำซ้ำบนอักขระที่เหลือใน String คำตอบอื่น ๆ มีรหัสนี้

  • ใช้setDelimiter("")เพื่อตั้งค่าตัวคั่นเป็นสตริงว่าง สิ่งนี้จะทำให้โทnext()เค็นเป็นสตริงที่มีความยาวหนึ่งอักขระ ดังนั้นคุณสามารถเรียกซ้ำnext().charAt(0)เพื่อย้ำตัวละครได้ จากนั้นคุณสามารถตั้งค่าตัวคั่นเป็นค่าเดิมและทำการสแกนต่อตามปกติได้!

  • ใช้ Reader API แทน Scanner API Reader.read()วิธีการส่งตัวเดียวอ่านจากสตรีมใส่ ตัวอย่างเช่น:

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

เมื่อคุณอ่านจากคอนโซลผ่านSystem.inระบบปฏิบัติการโดยทั่วไปอินพุตจะถูกบัฟเฟอร์โดยระบบปฏิบัติการและ "ปล่อย" ไปยังแอปพลิเคชันเมื่อผู้ใช้พิมพ์ ENTER ดังนั้นหากคุณต้องการให้แอปพลิเคชันของคุณตอบสนองต่อการกดแป้นพิมพ์แต่ละครั้งสิ่งนี้จะไม่ได้ผล คุณจะต้องทำบางสิ่งบางอย่างของโค้ดเนทีฟเฉพาะ OS เพื่อปิดหรือหลีกเลี่ยงการบัฟเฟอร์บรรทัดสำหรับคอนโซลในระดับ OS

อ้างอิง:


โปรดยกตัวอย่างสิ่งที่คุณพูด
Ralph

4

คุณสามารถแก้ปัญหานี้ได้จาก "การจับคีย์บอร์ดทีละตัวอักษร" อย่างง่ายๆ โดยไม่ต้องใช้เครื่องสแกนเนอร์ทั้งหมดและยังไม่ล้างบัฟเฟอร์อินพุตเป็นผลข้างเคียงโดยใช้สิ่งนี้

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

หากสิ่งที่คุณต้องการคือฟังก์ชันเดียวกับฟังก์ชัน "getChar ()" ของภาษา C สิ่งนี้จะใช้งานได้ดี ข้อได้เปรียบที่ยิ่งใหญ่ของ "System.in.read ()" คือบัฟเฟอร์จะไม่ถูกล้างออกหลังจากที่คุณคว้าแต่ละครั้ง ดังนั้นหากคุณยังต้องการอินพุตของผู้ใช้ทั้งหมดคุณยังสามารถรับส่วนที่เหลือได้จากบัฟเฟอร์อินพุต "char c = scanner.next().charAt(0);"วิธีที่จะคว้าถ่าน แต่จะล้างบัฟเฟอร์

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

หวังว่าจะเป็นประโยชน์และขอให้โชคดี! ป.ล. ขออภัยฉันรู้ว่านี่เป็นโพสต์ที่เก่ากว่า แต่ฉันหวังว่าคำตอบของฉันจะทำให้เกิดความเข้าใจใหม่ ๆ และอาจช่วยคนอื่น ๆ ที่มีปัญหานี้ได้


3

สิ่งนี้ใช้ไม่ได้จริง:

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

คำถามนี้มีคำอธิบายและการอ้างอิงที่ดี: เหตุใดคลาส Scanner จึงไม่มีเมธอด nextChar "เครื่องสแกนจะแบ่งข้อมูลที่ป้อนออกเป็นโทเค็นโดยใช้รูปแบบตัวคั่น" ซึ่งค่อนข้างเปิดได้ ตัวอย่างเช่นเมื่อใช้สิ่งนี้

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

สำหรับบรรทัดอินพุตนี้ "(1 + 9) / (3 - 1) + 6 - 2" การเรียกไปยังผลตอบแทนถัดไป "(1", c จะถูกตั้งค่าเป็น '(' และคุณจะสูญเสีย ' 1 'ในการโทรครั้งถัดไปถัดไป ()

โดยปกติแล้วเมื่อคุณต้องการรับตัวละครคุณจะไม่สนใจช่องว่าง สิ่งนี้ใช้ได้ผลสำหรับฉัน:

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

การอ้างอิง: regex เพื่อจับคู่อักขระเดี่ยวที่เป็นอะไรก็ได้ยกเว้นเว้นวรรค


FYI"[^\\s]" === "\\S"
โบฮีเมียน


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

คุณควรใช้โปรแกรมอ่านอินพุตที่กำหนดเองเพื่อให้ได้ผลลัพธ์ที่เร็วขึ้นแทนที่จะแยกอักขระตัวแรกออกจากการอ่าน String ลิงก์สำหรับ Custom ScanReader และคำอธิบาย: https://gist.github.com/nik1010/5a90fa43399c539bb817069a14c3c5a8

รหัสสำหรับการสแกน Char:

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

คุณควรเพิ่มรหัสจากส่วนสำคัญในคำตอบของคุณเนื่องจากอาจใช้ไม่ได้ในบางครั้ง
Markus

@Markus เพิ่มสำหรับการสแกนถ่าน
NIKUNJ KHOKHAR

1

มีสองวิธีที่คุณสามารถใช้เวลาว่าตัวละครตัวหนึ่งหรืออย่างเคร่งครัดตัวละครตัวหนึ่ง เมื่อคุณใช้อย่างแน่นอนผู้อ่านจะใช้เฉพาะอักขระตัวแรกโดยไม่คำนึงถึงจำนวนอักขระที่คุณป้อน

ตัวอย่างเช่น:

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

        }



    }  

}  

เมื่อคุณกำหนดชุดอักขระเป็นอินพุตให้พูดว่า "abcd" ผู้อ่านจะพิจารณาเฉพาะอักขระตัวแรกคือตัวอักษร "a"

แต่เมื่อคุณใช้อย่างเคร่งครัดอินพุตควรเป็นเพียงอักขระเดียว หากอินพุตมีมากกว่าหนึ่งอักขระเครื่องอ่านจะไม่รับอินพุต

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

        }



    }  

}  

สมมติว่าคุณให้อินพุต "abcd" ไม่มีอินพุตและตัวแปรcจะมีค่า 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);

    }
}

เพื่อให้ได้อักขระเพียงตัวเดียว char c = reader.next ("."). charAt (0);


เพื่อให้ได้อักขระเพียงตัวเดียว 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

คุณควรได้รับ String โดยใช้ scanner.next () และเรียกใช้เมธอด String.charAt (0) บนสตริงที่ส่งคืน
ตัวอย่าง:

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


        }

เอาท์พุต

Enter a character: 
a
You have entered: a


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

อย่างไรก็ตามคุณไม่สามารถใช้ถ่านเป็นอินพุตได้โดยตรง ดังที่คุณเห็นด้านบน String จะถูกนำมาก่อนตามด้วย charAt (0); พบและจัดเก็บ


-1

เพียงใช้ ...

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

สิ่งนี้ได้รับอักขระตัวแรกของอินพุตถัดไป


-2

คุณสามารถใช้พิมพ์ดีด:

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

วิธีนี้คุณจะป้อนข้อมูลใน String เนื่องจากฟังก์ชัน 'next ()' แต่จะถูกแปลงเป็นอักขระเนื่องจาก 'char' ที่กล่าวถึงในวงเล็บ

วิธีการแปลงประเภทข้อมูลนี้โดยการกล่าวถึงประเภทข้อมูลปลายทางในวงเล็บเรียกว่าการพิมพ์ มันใช้ได้กับฉันฉันหวังว่ามันจะเหมาะกับคุณ :)


คุณไม่สามารถพิมพ์ a Stringถึง a char.
Stephen C

-3

หากต้องการค้นหาดัชนีของตัวละครในการต่อยที่กำหนดคุณสามารถใช้รหัสนี้:

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

วิธีที่ง่ายที่สุดคือขั้นแรกให้เปลี่ยนตัวแปรเป็น String และยอมรับอินพุตเป็นสตริง จากนั้นคุณสามารถควบคุมตามตัวแปรอินพุตด้วยคำสั่ง if-else หรือ switch ดังต่อไปนี้

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>
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.