スキャナーから文字入力を受け取ります


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

使用できる文字を1つだけ消費するは:

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

厳密に 1文字を消費するには、次のように使用できます。

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


7
実際には複数のキャラクターを使用しますが、最初のキャラクターのみに作用します
ラルフ

1
@ user1804697文字のみを使用するにはchar c = reader.next("[a-zA-Z]").charAt(0);
Reimeus

10
この文脈で「正確に」と「厳密に」の違いは何ですか?

2
@Reimeus正確にコードを貼り付けて実行することの価値は何ですか?
bharal

53

セットアップスキャナー:

reader.useDelimiter("");

この後reader.next()、1文字の文字列が返されます。


17

スキャナーから文字を取得するAPIメソッドはありません。返された文字列に対してメソッドを使用し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

この問題に対処するには3つの方法があります。

  • next()スキャナーを呼び出して、文字列の最初の文字を抽出しcharAt(0)ます(例:)行の残りの部分を文字として読みたい場合は、文字列の残りの文字を繰り返し処理します。他の答えはこのコードを持っています。

  • setDelimiter("")区切り文字を空の文字列に設定するために使用します。これによりnext()、ちょうど1文字の長さの文字列にトークン化されます。したがって、繰り返し呼び出しnext().charAt(0)て文字を繰り返すことができます。その後、区切り文字を元の値に設定して、通常の方法でスキャンを再開できます。

  • Scanner APIの代わりにReader 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

「キーボード入力を一度に1文字ずつ取得する」というこの問題は非常に簡単に解決できます。これを使用することにより、スキャナーをすべて使用する必要がなく、副作用として入力バッファーをクリアする必要もありません。

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

必要なのがC言語の「getChar()」関数と同じ機能である場合、これはうまく機能します。"System.in.read()"の大きな利点は、グラブするたびにバッファがクリアされないことです。したがって、すべてのユーザー入力が必要な場合でも、残りの入力を入力バッファーから取得できます。"char c = scanner.next().charAt(0);"方法は、charをつかむませんが、バッファをクリアします。

// 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は '('に設定され、最終的には ' next()への次の呼び出しで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

charをスキャンするための@Markusが追加されました。
NIKUNJ KHOKHAR 2017年

1

2つのアプローチがあり、正確に 1文字または厳密に 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」のみが考慮されます。

ただし、厳密に使用する場合、入力は1文字のみにする必要があります。入力が複数の文字の場合、リーダーは入力を受け取りません

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

    }
}

1文字だけを取得するにはchar c = reader.next( "。")。charAt(0);


1文字だけを取得するには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

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

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

ちなみに、charを直接入力として受け取ることはできません。上記のように、最初に文字列が取得され、次に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();

このようにして、関数 'next()'によりStringで入力を取得しますが、括弧内の 'char'により文字に変換されます。

宛先データ型を括弧で囲んでデータ型を変換するこの方法は、タイプキャットと呼ばれます。それは私にとってはうまくいきます、私はそれがあなたのためにうまくいくことを願っています:)


a Stringをに型キャストすることはできませんchar
スティーブン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

最も簡単な方法は、最初に変数を文字列に変更し、入力を文字列として受け入れることです。次に、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.