Metody warunkowe - blad

0

Witam,

pisze sobie kod do wielokrotnego wyboru. Kod przedstawiam ponizej:

import java.util.*;

public class Main
{
	public static void main(String[] args)
	{
		Scanner wejscie = new Scanner(System.in);
		
		System.out.println("Co chcesz zrobic:");
		System.out.println("1 - zamiana ciagu na male literki");
		System.out.println("2 - zamiana ciagu na DUZE LITERKI");
		System.out.println("---------------------------------");
		System.out.println("0 - zamkniecie programu");
		System.out.print("Wybor: ");
		
		char wybor = wejscie.next().charAt(0);
		
		if (wybor == '1')
		{
			System.out.print("Podaj jakis ciag do zamiany na male literki: ");
			String zdanie = wejscie.nextLine();
			System.out.print("KONTROLA");
			System.out.print(zdanie.toLowerCase());
		}
		else if (wybor == '2')
		{
			System.out.print("Podaj jakis ciag do zamiany na DUZE LITERKI: ");
			String zdanie = wejscie.nextLine();
			System.out.print(zdanie.toUpperCase());
		}
		else if (wybor == '0')
		{
			System.exit(0);
		}
		else if ((wybor != '1') &&
			(wybor != '2') &&
			(wybor != '0'))
			System.out.print("WYBOR SPOZA ZAKRESU!");
	}
}

Program, w zaleznosci jaka opcje wybiore, powinien dzialac nastepujaco:
1 - wpisuje ciag znakow i zamienia go na male literki
2 - wpisuje ciag znakow i zamienia go na duze literki
0 - zamyka program
inny - pokazuje komunikat o nieprawidlowym wyborze.

Problem w tym ze gdy wybiore np opcje nr 1 to program pyta o wprowadzenie ciagu ale jednoczesnie opuszcza linie przeznaczona do wprowadzenia ciagu i wyswietla kontrolny zapis. Co robie zle?

Pozdrawiam!

0

To mi wygląda na to, że po wpisaniu cyferki wciskasz Enter, więc w buforze zostaje zapisany znak nowej linii. W związku z tym funkcja nextLine widzi nową linię i zwraca "".
Inaczej:

  1. Wpisujesz 1 i wciskasz Enter
  2. W buforze zapisują się znaki 1 i \n
  3. Funkcja next czyta do pierwszego białego znaku, tzn. czyta 1 i przerywa działanie
  4. Funkcja nextLine czyta od miejsca, w którym next przerwała, czyli od znaku \n
  5. \n oznacza koniec linii, więc nextLine kończy od razu, zwracając ""

Spróbuj użyć System.in.read zamiast Scanner#next, ale nie wiem, jak wygląda sprawa z buforowaniem - mogą być problemy. W takim wypadku przenieś definicję zmiennej wejscie tuż nad if (wybor == 1)

0

Niestety tak chyba nie jest poniewaz moj poprzedni kod nawiazujacy do metody String replace rowniez mial takie "menu" i dzialal poprawnie:

import java.util.*;

public class Main
{
	public static void main(String[] args)
	{
		short indeks1, indeks2;
		Scanner wejscie = new Scanner (System.in);
		
		System.out.print("Podaj jakies zdanie: ");
		String zdanie = wejscie.nextLine();
		
		System.out.print("Czy chcesz podac dwa parametry czy 1? (1/2): ");
		char jedenCzyDwa = wejscie.next().charAt(0);
	
		if (jedenCzyDwa == '1')
		{
			System.out.print("Podaj numer indeksu od ktorego skopiowac lancuch: ");
			indeks1 = wejscie.nextShort();
			//wyswietlanie wyniku
			System.out.print(zdanie.substring(indeks1));
		}
		else if (jedenCzyDwa == '2')
		{
			System.out.print("Podaj pierwszy indeks (poczatkowy): ");
			indeks1 = wejscie.nextShort();
			
			System.out.print("Podaj drugi indeks (koncowy): ");
			indeks2 = wejscie.nextShort();
			
			//wyswietlanie wyniku
			System.out.print(zdanie.substring(indeks1, indeks2));
		}
		//jesli podano cos spoza zakresu
		else if ((jedenCzyDwa != '1') && (jedenCzyDwa != '2'))
			System.out.print("NIEPOPRAWNY WYBOR!");
	}
}
0

Kurcze a moze i masz racje. Porownalem te dwa kody i w tym problematycznym String pobierany jest po dokonaniu wyboru a w tym drugim (co niby dziala poprawnie) - przed. I gdy pobieranie Stringa przeniose na sam poczatek to wszystko dziala jak nalezy:

import java.util.*;

public class Main
{
	public static void main(String[] args)
	{
		Scanner wejscie = new Scanner(System.in);
		
		System.out.print("Podaj zdanie wejsciowe: ");
		String zdanie = wejscie.nextLine();

		System.out.println(zdanie);
		System.out.println("Co chcesz zrobic:");
		System.out.println("1 - zamiana ciagu na male literki");
		System.out.println("2 - zamiana ciagu na DUZE LITERKI");
		System.out.println("---------------------------------");
		System.out.println("0 - zamkniecie programu");
		System.out.print("Wybor: ");
			
		char wybor = wejscie.next().charAt(0);
	
		
		
		if (wybor == '1')
		{
			System.out.print(zdanie.toLowerCase());
		}
		else if (wybor == '2')
		{
			System.out.print(zdanie.toUpperCase());
		}
		else if (wybor == '0')
		{
			System.exit(0);
		}
		else if ((wybor != '1') &&
			(wybor != '2') &&
			(wybor != '0'))
			System.out.print("WYBOR SPOZA ZAKRESU!");

	}
}

Ale jak wczytać pojedynczy znak używając System.in.read? Tam można wczytać tylko wartości liczbowe.

0

Serio, pobieranie znaku to az taki problem w Javie? Bo wierzyć mi się nie chce.

1

Już bez przesady z tym problemem. Możesz zmienić

 char wybor = wejscie.next().charAt(0);

na

 char wybor = wejscie.nextLine().charAt(0);

i powinno działać, albo po prostu pobrać ten znak nowej linii.
Z tego co się orientuję to nie tylko w Javie w C++ też taki problem jest ;)

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