Parametry wejściowe w command line

Parametry wejściowe w command line
SC
  • Rejestracja:prawie 7 lat
  • Ostatnio:prawie 7 lat
  • Postów:3
0

Witam

Poniższy kod ma wyświetlić wszystkie parametry podane na wejściu, ma na celu jedynie zobrazowanie problemu. Po wywołaniu tego kodu z parametrami np. 3 5 8 2 *
Program wyświetla:

0 Argument: 3
1 Argument: 5
2 Argument: 8
3 Argument: 2
4 Argument: Testy.class
5 Argument: Testy.java

Pytaniem jest dlaczego zamiast przypisać gwiazdkę do tablicy, program wprowadza do niej zawartość folderu? I jak wprowadzić "*" do tablicy poprzez command line.

Kod programu:

Kopiuj
public class Testy {
    public static void main (String[] args)
    {
        for(int i=0; i<args.length; i++)
        {
            System.out.println(i+ " Argument: "+ args[i]);
        }
    }
}

R3
  • Rejestracja:ponad 11 lat
  • Ostatnio:dzień
  • Postów:419
0

U mnie działa

Kopiuj
javac Testy.java && java Testy 3 5 8 2 "*"
SC
  • Rejestracja:prawie 7 lat
  • Ostatnio:prawie 7 lat
  • Postów:3
0

Mam na myśli, kiedy użytkownik wprowadza parametry w taki sposób: 3 5 8 2 * (bez cudzysłowu)

OK
  • Rejestracja:prawie 8 lat
  • Ostatnio:prawie 7 lat
  • Postów:3
3

Hej, część znaków specjalnych, głównie z tych z shella w Java są interpretowane na poziome przetwarzania jako argumenty wywołania programu. W tym przypadku * bierze wszystko co znajduje się w katalogu.
Gdybyś np użył

Kopiuj
*.java

, to Twój program wypisze:

Kopiuj
0 Argument: 3
1 Argument: 5
2 Argument: 8
3 Argument: 2
4 Argument: Testy.java

Na stacku już ktoś poruszał ten wątek: stackoverflow

Obawiam się że w przypadku prostego programu będziesz zmuszony/a korzystać ze znaków cudzysłowowa, aby przetworzyć * jako znak.
Możesz też zaglądnąć do bibliotek, np: Apache Commons CLI.

edytowany 2x, ostatnio: okarmusk
SC
  • Rejestracja:prawie 7 lat
  • Ostatnio:prawie 7 lat
  • Postów:3
0

Dzięki za szybkie odpowiedzi.
Chciałbym jednak spróbować, aby program przetwarzał ten znak specjalny na zwykłego Stringa.

Mógłbym uzyskać od Was jakieś wskazówki jak można to zrobić?
Jakoś wyłączyć znaki specjalne na czas wykonywania danego fragmentu programu? Zmodyfikować działanie znaku specjalnego przy tym programie?

Daniel Witusowski
  • Rejestracja:prawie 7 lat
  • Ostatnio:prawie 7 lat
  • Postów:7
0
Kopiuj
import java.util.Scanner;

Scanner scan = new Scanner(System.in);
String[] arguments = new String[7];
char c;
int i=0;
while(c!=(//Tutaj wpisz jaki miałby być znak, który by zakończył dopisywanie do String'a//)){
 c = scan.next().charAt(0);
     arguments[i] = c;
     i++;
}

W ten sposób otrzymując input od użytkownika możesz zapisać do dowolnej tablicy String, np typowej dla main'a tablicy arguments, znak wpisany jako pierwszy. Nie sprawdzałem tego osobiście ale nieco poszperałem i między innymi takie rozwiązanie z tego mi się ułożyło. Jeżeli nie będzie Ci dalej działać albo nie chodziło o to, to poszukam dalej o ile ktoś mnie nie uprzedzi z dobrą odpowiedzią.

edytowany 1x, ostatnio: Daniel Witusowski
YA
  • Rejestracja:prawie 10 lat
  • Ostatnio:9 dni
  • Postów:2370
1

Shell, którego używasz do uruchomienia programu (windowsowy cmd, linuxowy bash etc.) może mieć znaki specjalne, które interpretuje i rozwija do jakichś wartości, np. $FOO pod bashem zostanie rozwinięte do wartości zmiennej FOO, podobnie %FOO% pod windowsem. Tak rozwinięta wartość zostanie przekazana do programu, który uruchamiasz.
Shelle umożliwiają escapowanie znaków specjalnych. Jak escapować? To zależy od konkretnego shella.

Można tak:

Kopiuj
3 5 8 2 \*

albo tak:

Kopiuj
3 5 8 2 ^*

albo tak:

Kopiuj
3 5 8 2 "*"
koszalek-opalek
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 2 lata
1
SoClose23 napisał(a):

Dzięki za szybkie odpowiedzi.
Chciałbym jednak spróbować, aby program przetwarzał ten znak specjalny na zwykłego Stringa.

Mógłbym uzyskać od Was jakieś wskazówki jak można to zrobić?
Jakoś wyłączyć znaki specjalne na czas wykonywania danego fragmentu programu? Zmodyfikować działanie znaku specjalnego przy tym programie?

Nie da się. Po prostu się nie da. :)

Twój program w Javie czy czym kolwiek innym nie ma tu nic do gadania. Program jest uruchamiany przez powłokę, a ta powłoka interpretuję gwiazdkę po swojemu ZANIM uruchomi Twój program.

Albo zrób to, co inni napisali (zaakceptuj to czego nie możesz zmienić i pisz w powłoce '*'), albo wybierz do swoich celów inny znak, który nie jest specjalny w powłoce (może %?)...

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.