Próbuję znaleźć sposób na pobranie char
danych wejściowych z klawiatury.
Próbowałem użyć:
Scanner reader = new Scanner(System.in);
char c = reader.nextChar();
Ta metoda nie istnieje.
Próbowałem wziąć c
jako String
. Jednak nie zawsze będzie działać w każdym przypadku, ponieważ inna metoda, którą wywołuję z mojej metody, wymaga a char
jako danych wejściowych. Dlatego muszę znaleźć sposób, aby jawnie przyjąć znak jako dane wejściowe.
Jakaś pomoc?
java
input
char
java.util.scanner
Ralph
źródło
źródło
char c = reader.next("[a-zA-Z]").charAt(0);
Konfiguracja skanera:
Po tym
reader.next()
zwróci ciąg jednoznakowy.źródło
Nie ma metody API, aby pobrać znak ze skanera. Powinieneś pobrać String używając
scanner.next()
i wywołaćString.charAt(0)
metodę na zwróconym String.Aby być bezpiecznym z białymi znakami, możesz również najpierw wywołać
trim()
łańcuch, aby usunąć wszelkie białe znaki.źródło
reader.next()
dałby ci już ciągu zaczynającego się od pierwszego niebiałego znaku?Istnieją trzy sposoby rozwiązania tego problemu:
Wywołaj
next()
skaner i wyodrębnij pierwszy znak ciągu (np.charAt(0)
) Jeśli chcesz odczytać resztę wiersza jako znaki, wykonaj iterację po pozostałych znakach ciągu. Inne odpowiedzi mają ten kod.Służy
setDelimiter("")
do ustawiania separatora na pusty ciąg. Spowoduje tonext()
tokenizację w łańcuchy o długości dokładnie jednego znaku. Więc możesz wielokrotnie wywoływać,next().charAt(0)
aby iterować znaki. Następnie możesz ustawić ogranicznik na jego oryginalną wartość i wznowić skanowanie w normalny sposób!Użyj interfejsu API czytnika zamiast interfejsu API skanera.
Reader.read()
Metoda dostarcza pojedynczy znak odczytany ze strumienia wejściowego. Na przykład:Podczas czytania z konsoli za pośrednictwem
System.in
, dane wejściowe są zwykle buforowane przez system operacyjny i „zwalniane” do aplikacji tylko wtedy, gdy użytkownik wpisze ENTER. Jeśli więc chcesz, aby Twoja aplikacja reagowała na poszczególne naciśnięcia klawisza, to nie zadziała. Będziesz musiał zrobić coś specyficznego dla systemu operacyjnego, aby wyłączyć lub obejść buforowanie linii dla konsoli na poziomie systemu operacyjnego.Odniesienie:
źródło
Możesz rozwiązać ten problem, polegający na „przechwytywaniu danych wejściowych z klawiatury po jednym znaku na raz” w bardzo prosty sposób. Bez konieczności używania skanera all, a także bez czyszczenia bufora wejściowego jako efektu ubocznego, używając tego.
Jeśli potrzebujesz tylko tej samej funkcjonalności, co funkcja „getChar ()” języka C, to będzie działać świetnie. Dużą zaletą "System.in.read ()" jest to, że bufor nie jest czyszczony po każdym znaku, który przechwycisz. Więc jeśli nadal potrzebujesz danych wejściowych wszystkich użytkowników, nadal możesz pobrać resztę z bufora wejściowego.
"char c = scanner.next().charAt(0);"
Sposób robi chwycić char ale będzie wyczyścić bufor.Mam nadzieję, że to pomocne i powodzenia! PS Przepraszam, wiem, że to starszy post, ale mam nadzieję, że moja odpowiedź przyniesie nowy wgląd i może pomóc innym osobom, które również mają ten problem.
źródło
To faktycznie nie działa:
Istnieje kilka dobrych wyjaśnień i odniesień w tym pytaniu: Dlaczego klasa Scanner nie ma metody nextChar? „Skaner rozbija swoje dane wejściowe na tokeny za pomocą wzorca separatora”, który jest dość otwarty. Na przykład podczas korzystania z this
dla tego wiersza wejścia "(1 + 9) / (3 - 1) + 6 - 2" wywołanie next zwraca "(1", c zostanie ustawione na '(', a skończysz na utracie ' 1 'przy następnym wywołaniu do next ()
Zazwyczaj, gdy chcesz uzyskać znak, chciałbyś zignorować białe spacje. To zadziałało dla mnie:
Odniesienie: wyrażenie regularne do dopasowania pojedynczego znaku, który jest czymś innym niż spacją
źródło
"[^\\s]" === "\\S"
Najlepszym sposobem na wprowadzenie znaku w klasie Scanner jest:
źródło
źródło
Spróbuj tego: char c = S.nextLine (). CharAt (0);
źródło
Aby uzyskać szybsze wyniki, należy użyć własnego czytnika wejściowego zamiast wyodrębniania pierwszego znaku z czytania ciągu. Link do Custom ScanReader i wyjaśnienie: https://gist.github.com/nik1010/5a90fa43399c539bb817069a14c3c5a8
Kod do skanowania Char:
źródło
Istnieją dwa podejścia, możesz wziąć dokładnie jedną postać lub tylko jedną postać. Jeśli użyjesz dokładnie, czytnik przyjmie tylko pierwszy znak, niezależnie od tego, ile znaków wprowadzisz.
Na przykład:
Kiedy podasz zestaw znaków jako dane wejściowe, powiedz „abcd”, czytelnik weźmie pod uwagę tylko pierwszy znak, tj. Literę „a”
Ale jeśli używasz ściśle, dane wejściowe powinny mieć tylko jeden znak. Jeśli na wejściu jest więcej niż jeden znak, czytnik nie weźmie wejścia
Załóżmy, że podajesz dane wejściowe „abcd”, żadne dane wejściowe nie są pobierane, a zmienna c będzie miała wartość Null.
źródło
Aby uzyskać tylko jeden znak char c = reader.next ("."). CharAt (0);
źródło
źródło
Powinieneś pobrać String używając scanner.next () i wywołać metodę String.charAt (0) na zwróconym Stringu.
Przykład:
wynik
źródło
po prostu musisz to napisać, aby uzyskać wartość typu char.
źródło
źródło
Spróbuj tego
źródło
Nawiasem mówiąc, nie możesz wziąć znaku bezpośrednio jako wejścia. Jak widać powyżej, najpierw pobierany jest String, a następnie charAt (0); zostanie znalezione i zapisane
źródło
Po prostu użyj...
To pobiera pierwszy znak następnego wejścia.
źródło
Możesz użyć rzutowania typów:
W ten sposób weźmiesz dane wejściowe w ciągu znaków ze względu na funkcję „next ()”, ale zostaną one zamienione na znaki ze względu na „znak” wymieniony w nawiasach.
Ta metoda konwersji typu danych poprzez podanie docelowego typu danych w nawiasach nosi nazwę typecating. U mnie to działa, mam nadzieję, że u ciebie działa :)
źródło
String
do achar
.Aby znaleźć indeks znaku w danym żądle, możesz użyć tego kodu:
źródło
Najłatwiej jest najpierw zmienić zmienną na String i zaakceptować dane wejściowe jako łańcuch. Następnie można sterować na podstawie zmiennej wejściowej za pomocą instrukcji if-else lub switch w następujący sposób.
źródło