Візьміть внесок із сканера


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
Насправді його приймає більше одного персонажа, але діє лише на першого персонажа
Ральф

1
@ user1804697 споживати лише символиchar c = reader.next("[a-zA-Z]").charAt(0);
Reimeus

10
Яка різниця між "точно" та "суворо" в цьому контексті?

2
@Reimeus, яке саме значення має копіювати код вставки та виконувати його?
бхарал

53

Налаштування сканера:

reader.useDelimiter("");

Після цього reader.next()повернеться односимвольний рядок.


17

Немає методу API для отримання символу зі сканера. Ви повинні отримати метод String, використовуючи метод scanner.next()виклику String.charAt(0)на поверненій рядку.

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()до сканера та витягніть перший символ рядка (наприклад charAt(0)) Якщо ви хочете прочитати решту рядка як символи, повторіть інші символи в рядку. Інші відповіді мають цей код.

  • Використовуйте setDelimiter("")для встановлення роздільника на порожній рядок. Це призведе next()до токенізації в рядки довжиною рівно одного символу. Тож тоді ви можете неодноразово дзвонити, next().charAt(0)щоб повторити символів. Потім ви можете встановити роздільник на початкове значення та відновити сканування звичайним способом!

  • Використовуйте програму Reader API замість 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. Тож якщо ви плануєте, щоб ваша програма реагувала на окремі обведення клавіатури, це не спрацює. Вам потрібно буде виконати деякі властивості кодового коду, характерні для ОС, щоб вимкнути або працювати навколо буферизації ліній для консолей на рівні ОС.

Довідка:


Скажіть, будь ласка, приклад того, що ви сказали
Ральф

4

Ви можете вирішити цю проблему "захоплення введення клавіатури по одному знаку за часом" дуже просто. Без необхідності використовувати Scanner all, а також не очищаючи вхідний буфер як побічний ефект, використовуючи це.

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

Сподіваюся, це корисно, і удачі! PS Вибачте, я знаю, що це старіший пост, але я сподіваюся, що моя відповідь принесе нове розуміння і могла б допомогти іншим людям, які також мають цю проблему.


3

Це насправді не працює:

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

У цьому питанні є кілька хороших пояснень та посилань: Чому у класу Сканер немає методу nextChar? "Сканер розбиває свій вхід у маркери за допомогою шаблону розмежувача", який досить відкрито закінчився. Наприклад, при використанні цього

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

для цього рядка введення "(1 + 9) / (3 - 1) + 6 - 2" виклик до наступного повернення "(1", c буде встановлено на "(", і ви в кінцевому рахунку втратите " 1 'при наступному дзвінку до наступного ()

Зазвичай, коли ви хочете отримати персонажа, ви хочете ігнорувати пробіли. Це працювало для мене:

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

Довідка: регулярний вираз, щоб відповідати одному символу, що є чим-небудь проміжком


FYI"[^\\s]" === "\\S"
богемський

2

Найкращий спосіб ввести персонаж у класі 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

Ви повинні використовувати свій власний читацький вхід для швидших результатів замість вилучення першого символу з читання String. Посилання для користувальницького ScanReader та пояснення: https://gist.github.com/nik1010/5a90fa43399c539bb817069a14c3c5a8

Код сканування Char:

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

Ви повинні додати код із суті у своїй відповіді, оскільки він може бути недоступним деякий час.
Маркус

@Markus додано для сканування карт.
NIKUNJ HHHHAR

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);
Ракеш Кумар Б

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) на поверненій String.
Приклад:

    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

0

Вам просто потрібно написати це для отримання значення в типі 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

Спробуйте це

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

До речі, ви не можете приймати знаки безпосередньо як вхідні дані. Як ви бачите вище, спочатку береться рядок, а потім 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', зазначений у дужках.

Цей спосіб перетворення типу даних шляхом згадування цільового типу даних у дужках називається типізацією. Це працює для мене, я сподіваюся, що це працює для u :)


Ви не можете ввести "a" Stringдо "" char.
Стівен С

-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>
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.