Tarayıcıdan bir karakter girişi alın


124

charKlavyeden giriş almanın bir yolunu bulmaya çalışıyorum .

Kullanmayı denedim:

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

Bu yöntem mevcut değil.

cOlarak almayı denedim String. Yine de, yöntemimden çağırdığım diğer yöntem chargirdi olarak a gerektirdiğinden, her durumda her zaman işe yaramazdı. Bu nedenle, bir karakteri girdi olarak açıkça almanın bir yolunu bulmalıyım.

Herhangi bir yardım?

Yanıtlar:


159

İlk karakteri şunlardan alabilirsin Scanner.next:

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

Tam olarak bir karakter tüketmek için kullanabilirsiniz:

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

Kesinlikle bir karakter tüketmek için kullanabilirsiniz:

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


7
Aslında birden fazla karakter alıyor, ancak yalnızca ilk karakteri canlandırıyor
Ralph

1
@ user1804697 sadece karakter kullanımı tüketmek içinchar c = reader.next("[a-zA-Z]").charAt(0);
Reimeus

10
Bu bağlamda "tam olarak" ve "kesinlikle" arasındaki fark nedir?

2
@Reimeus, kodu kopyalayıp yapıştırmanın ve ardından çalıştırmanın değeri tam olarak nedir?
bharal

54

Kurulum tarayıcı:

reader.useDelimiter("");

Bundan sonra reader.next()tek karakterlik bir dizge dönecektir.


17

Tarayıcıdan bir karakter almanın API yöntemi yoktur. Döndürülen String üzerinde String kullanarak scanner.next()ve çağırma String.charAt(0)yöntemini almalısınız .

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

Beyaz boşluklarla güvende olmak için ilk önce trim()beyaz boşlukları kaldırmak için dizeyi çağırabilirsiniz .

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

reader.next()İlk beyaz olmayan karakterden başlayarak dizeyi size zaten vermez miydiniz ?
norok2

12

Bu soruna yaklaşmanın üç yolu vardır:

  • next()Tarayıcıyı çağırın ve Dizenin ilk karakterini çıkarın (örn. charAt(0)) Satırın geri kalanını karakter olarak okumak istiyorsanız, Dizede kalan karakterleri yineleyin. Diğer cevaplarda bu kod vardır.

  • setDelimiter("")Sınırlayıcıyı boş bir dizeye ayarlamak için kullanın . Bu next(), tam olarak bir karakter uzunluğundaki dizeler halinde belirtilmeye neden olur . Böylece karakterleri yinelemek için tekrar tekrar arayabilirsin next().charAt(0). Ardından, sınırlayıcıyı orijinal değerine ayarlayabilir ve normal şekilde taramaya devam edebilirsiniz!

  • Tarayıcı API'si yerine Reader API'yi kullanın. Reader.read()Yöntem, girdi akışından okumak tek bir karakter verir. Örneğin:

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

Konsoldan okuduğunuzda System.in, girdi tipik olarak işletim sistemi tarafından arabelleğe alınır ve yalnızca kullanıcı ENTER yazdığında uygulamaya "bırakılır". Dolayısıyla, uygulamanızın bireysel klavye vuruşlarına yanıt vermesini düşünüyorsanız, bu işe yaramayacaktır. İşletim sistemi düzeyinde konsol için satır arabelleğini kapatmak veya bunun etrafında çalışmak için işletim sistemine özgü bazı yerel kod işleri yapmanız gerekir.

Referans:


Lütfen söylediklerinize bir örnek verebilir misiniz
Ralph

4

Bu sorunu, "her seferinde bir karakter klavye girişi almak" sorununu çok basit bir şekilde çözebilirsiniz. Tarayıcıyı tamamen kullanmak zorunda kalmadan ve ayrıca bunu kullanarak giriş arabelleğini bir yan etki olarak temizlemeden.

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

İhtiyacınız olan tek şey C dili "getChar ()" işleviyle aynı işlevselliğe sahipse, bu harika çalışacaktır. "System.in.read ()" in en büyük avantajı, arabelleğinizin kaptığınız her şarjdan sonra temizlenmemesidir. Dolayısıyla, hala tüm kullanıcı girişlerine ihtiyacınız varsa, geri kalanını yine de giriş arabelleğinden alabilirsiniz. Yol "char c = scanner.next().charAt(0);"kömürü yakalar ama tamponu temizler.

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

Umarım bu yardımcı olur ve iyi şanslar! PS Üzgünüm, bunun daha eski bir gönderi olduğunu biliyorum, ancak cevabımın yeni bilgiler getireceğini ve bu sorunu yaşayan diğer insanlara da yardımcı olabileceğini umuyorum.


3

Bu aslında çalışmıyor:

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

Bu soruda bazı iyi açıklamalar ve referanslar vardır: Scanner sınıfı neden nextChar yöntemine sahip değil? "Tarayıcı, girişini bir sınırlayıcı desen kullanarak jetonlara böler", bu oldukça açık uçludur. Örneğin bunu kullanırken

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

bu "(1 + 9) / (3 - 1) + 6 - 2" girdi satırı için sonraki dönüşlere çağrı "(1", c '(' olarak ayarlanacak ve ' Sonraki aramada 1 '()

Genellikle bir karakter elde etmek istediğinizde boşlukları yok saymak istersiniz. Bu benim için çalıştı:

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

Referans: boşluktan başka herhangi bir şey olmayan tek bir karakterle eşleşecek normal ifade


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

2

Scanner sınıfında bir karakter girişi almanın en iyi yolu şudur:

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'i okumaktan ilk karakteri çıkarmak yerine daha hızlı sonuçlar için özel giriş okuyucunuzu kullanmalısınız. Özel ScanReader için bağlantı ve açıklama: https://gist.github.com/nik1010/5a90fa43399c539bb817069a14c3c5a8

Char tarama kodu:

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

Bir süre kullanılamayacağı için cevabınızın temelindeki kodu eklemelisiniz.
Markus

@Markus karakter taraması için eklendi.
NIKUNJ KHOKHAR

1

İki yaklaşım vardır, ya tam olarak bir karakter ya da sadece bir karakter alabilirsiniz. Tam olarak kullandığınızda, okuyucu kaç karakter girdiğinizden bağımsız olarak yalnızca ilk karakteri alacaktır.

Örneğin:

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

        }



    }  

}  

Giriş olarak bir dizi karakter verdiğinizde, örneğin "abcd", okuyucu yalnızca ilk karakteri, yani 'a' harfini dikkate alacaktır.

Ancak kesinlikle kullandığınızda, giriş yalnızca bir karakter olmalıdır. Giriş birden fazla karakter ise, okuyucu girişi almayacaktır

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

        }



    }  

}  

Diyelim ki "abcd" girdisi veriyorsunuz, hiçbir girdi alınmıyor ve değişken c Null değerine sahip olacak.


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

    }
}

Yalnızca bir karakter elde etmek için char c = reader.next ("."). CharAt (0);


Yalnızca bir karakter elde etmek için 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'i tarayıcı.next () kullanarak almanız ve döndürülen String üzerinde String.charAt (0) yöntemini çağırmanız gerekir.
Örnek:

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


        }

çıktı

Enter a character: 
a
You have entered: a

0

char türünde değer elde etmek için bunu yazmanız yeterlidir.

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

Bunu dene

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

Bu arada, bir karakteri doğrudan girdi olarak alamazsınız. Yukarıda görebileceğiniz gibi, önce bir String alınır sonra charAt (0); bulundu ve saklandı


-1

Sadece kullan...

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

Bu, bir sonraki girişin ilk karakterini alır.


-2

Yazmayı kullanabilirsiniz:

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

Bu şekilde, 'next ()' işlevi nedeniyle String'de girdi alacaksınız, ancak daha sonra parantez içinde belirtilen 'char' nedeniyle karaktere dönüştürülecektir.

Hedef veri türünün parantez içinde belirtilerek veri türünün dönüştürülmesine yönelik bu yönteme tipleme denir. Benim için çalışıyor, umarım sizin için de işe yarar :)


Bir typecasting edemez Stringbir etmek char.
Stephen C

-3

Belirli bir sokmada bir karakterin dizinini bulmak için şu kodu kullanabilirsiniz:

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

En kolay yol, önce değişkeni bir String olarak değiştirmek ve girişi bir dize olarak kabul etmektir. Ardından, aşağıdaki gibi bir if-else veya switch deyimiyle giriş değişkenine dayalı olarak kontrol edebilirsiniz.

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>
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.