Wprowadzanie aż do znaku końca linii[ENTER]

0

Witam !
Mam problem z następującym zadaniem (to są moje początki programowania):
Napisz program tablica znaków, który pobiera od użytkownika pojedyncze znaki (maksymalnie 30), aż do wprowadzenia znaku końca linii [ENTER]. Następnie wypisuje łańcuch znakowy składający się wyłącznie z małych i dużych liter. Wszystkie inne znaki są pomijane.

Jak na razie napisałem dopiero sam początek (podrzucę poniżej kod) i szczerze mówiąc stoję w miejscu, ponieważ nie wiem jak rozwiązać problem uwzględnienia tego entera, tzn myślałem aby w pętli for dodać if zapisanego w postaci

for(tab[i]!="/n") 

ale nie umiem tego na razie rozwinąć i brakuje mi wiedzy.

Scanner r=new Scanner(System.in);
            String[] tab=new String[30];
            System.out.println("Podaj znaki, zakończ ciąg enterem");
            
            for(int i=0;i<tab.length;i++){
                System.out.println();
                tab[i]= r.nextLine();
                
            } 

Prosiłbym o sugestię jak rozwinąć mój kod, albo jak się inaczej wziąć za to zadanie (myślałem o while, ale nie mam pomysłu jak to wykonać).
Proszę o wyrozumiałość.

0

Nowa linia nie jest wczytywana do ciągu wynikowego z nextLine().
Najprościej po prostu sprawdzaj dane, aż nie napotkasz pustej linii.

1

Ja bym tak pobrał

try {System.out.println(scanner.next(Pattern.compile(".{1,30}")));}catch(Exception e) {System.err.println("Max 30. Jeszcze raz");}
0

Jak co, nie podejmuje sie tłumaczenia

1

Dodatkowo, jeżeli ciekawi Cię, jakbym ja rozwiązał całe zadanie:

try {
   System.out.println(
     new Scanner(System.in).useDelimiter("\n").next(".{1,30}").replaceAll("[^a-z|A-Z]", "")
   );
}catch(Exception e) { System.err.println("max 30"); }

Chyba że "...który pobiera od użytkownika pojedyncze znaki...", znaczy enter po każdym znaku, a sprawdza to Tobie komputer, w takim wypadku

final Scanner scanner = new Scanner(System.in);
String string = "", tmp;
        
while(string.length() < 30 && !(tmp = scanner.nextLine()).isEmpty()) 
    string += tmp.charAt(0);

System.out.println(string.replaceAll("[^a-z|A-Z]", ""));

Zobacz co się stanie, gdy zamienisz kolejność w wyr. warunk pętli, lub operator koniunkcji, zamienisz z leniwego na zachłanny.
Lubię takie śniadanka xD

0

Dzięki wielkie za kod i propozycje, zaraz go przeanalizuję i zobaczę jak działa.
Dowiedziałem się też jak postępować z tym enterem (w moim prymitywnym kodzie), gdyby komuś się to na przyszłość przydało:

for(int i=0;i<tab.length;i++){
                System.out.println();
                tab[i]= r.nextLine();
                if(tab[i].equals("")){
                break;
                }
1

Jeśli chodzi o drugą część zadania, to polecam zająć się tematem wyrażenia regularne.
IMO, najlepszy, najbardziej przystępny materiał o tym:
http://fatcat.ftj.agh.edu.pl/~bogdan/unix.pdf
Ciebie interesuje do momentu predefiniowane klasy znaków - rozszerzenia perla

Jeżeli nie czujesz się na siłach, to możesz sobie zdefiniować jakiś łańcuch znaków, które mają być dopuszczalne lub nie, i potem sprawdzać czy któryś ze znaków zawiera się w tym łańcuchu, np

final String mask = "0123456789ad"; // znaki które mogą występować
final String array = "ankjasdn 234o123 jn1o2"; // jakis tam łanuch 

// teraz wypisujemy z array tylko te znaki, które zawiera mask
for(char c: array.toCharArray())
    System.out.print(mask.contains(c + "")? c : ""); // jeżeli mask zawiera c, to wypisz c
0

Okej, jeszcze dzisiaj się temu przyjrzę, dzięki za rady !

1 użytkowników online, w tym zalogowanych: 0, gości: 1