Parametry wejściowe w command line

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:

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

0

U mnie działa

javac Testy.java && java Testy 3 5 8 2 "*"
0

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

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ł

*.java

, to Twój program wypisze:

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.

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?

0
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ą.

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:

3 5 8 2 \*

albo tak:

3 5 8 2 ^*

albo tak:

3 5 8 2 "*"
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 %?)...

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