Возьмите ввод символа со сканера


124

Я пытаюсь найти способ charвводить данные с клавиатуры.

Я пробовал использовать:

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

Такого метода не существует.

Пробовал брать cв качестве String. Тем не менее, это не всегда сработает в каждом случае, поскольку другой метод, который я вызываю из своего метода, требует charв качестве входных данных. Поэтому мне нужно найти способ явно использовать 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, какое именно значение имеет копирование, вставка кода и его запуск?
bharal 07

54

Настроить сканер:

reader.useDelimiter("");

После этого reader.next()вернется односимвольная строка.


17

Не существует метода API для получения символа из сканера. Вы должны получить String using 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()сканер и извлеките первый символ строки (например charAt(0)). Если вы хотите прочитать остальную часть строки как символы, перебирайте оставшиеся символы в строке. В других ответах есть этот код.

  • Используйте, 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. Поэтому, если вы хотите, чтобы ваше приложение реагировало на отдельные нажатия клавиатуры, это не сработает. Вам нужно будет выполнить некоторые специфические для ОС особенности машинного кода, чтобы отключить или обойти буферизацию строк для консоли на уровне ОС.

Ссылка:


Не могли бы вы привести пример того, что вы сказали?
Ральф

4

Вы можете решить эту проблему "захватом ввода с клавиатуры по одному символу за раз" очень просто. Без необходимости использовать Scanner all, а также без очистки входного буфера в качестве побочного эффекта, используя this.

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

В этом вопросе есть несколько хороших объяснений и ссылок: Почему у класса Scanner нет метода nextChar? «Сканер разбивает свой ввод на токены, используя шаблон разделителя», что довольно открыто. Например, при использовании этого

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

для этой строки ввода "(1 + 9) / (3 - 1) + 6 - 2" вызов следующей возвращается "(1", c будет установлен в '(', и вы потеряете ' 1 'при следующем вызове next ()

Обычно, когда вы хотите получить символ, вы игнорируете пробелы. Это сработало для меня:

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

Ссылка: регулярное выражение для соответствия одному символу, который не является пробелом


К вашему сведению"[^\\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

Для более быстрых результатов следует использовать настраиваемое средство чтения ввода вместо извлечения первого символа из строки чтения. Ссылка для Custom ScanReader и объяснение: https://gist.github.com/nik1010/5a90fa43399c539bb817069a14c3c5a8

Код для сканирования Char:

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

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

@Markus добавлен для сканирования char.
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», читатель будет рассматривать только первый символ, то есть букву «а».

Но если вы используете строго, ввод должен состоять только из одного символа. Если введено более одного символа, то читатель не примет ввод

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) для возвращаемой 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 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

Между прочим, вы не можете напрямую использовать char в качестве входных данных. Как вы можете видеть выше, сначала берется 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>
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.