2013-12-11 8 views
6

Ich schreibe ein C-Programm über Reverse Polish Notation, das seine Operanden und Operatoren durch die Befehlszeilenargumente nimmt. Aber die Dinge laufen schief, wenn der Multiplikationsoperator '*' auftritt, und ich weiß nicht warum.
Hier ist das kleine Programm zum Debuggen.Falsche Befehlszeilenargumente Nummer beim Übergeben von `*`

test.c

int main(int argc, char **argv) 
{ 
    printf("%d\n", argc); 
    return 0; 
} 

// run case   result 
    ./test a b   3 
    ./test *    66 

Warum also das "* Argument macht ein falsches Ergebnis?

+2

'*' haben eine besondere Bedeutung. – Maroun

+1

Die Shell erweitert '*' um alle sichtbaren Dateien in dem Verzeichnis, in dem Sie das Programm ausführen. Verwenden Sie einfach 'x' als Multiplikationsoperator – hetepeperfan

Antwort

11

Die * macht einen Shell-Glob. Es wird also auf alle Dateien in Ihrem aktuellen Verzeichnis erweitert, die die Argumente für Ihr Programm darstellen. Sie haben 65 Dateien in Ihrem Verzeichnis. Sie können sehen, was passiert, wenn Sie echo *

Sie zu Apostroph benötigen laufen die * wie in ./test '*' (doppelte Anführungszeichen funktionieren würde), das die Shell * Erweiterung zu verhindern. Eine * wird Ihrem Programm in diesem Fall gegeben, die Shell entfernt die einfachen Anführungszeichen.

Wenn Sie Ausdrücke auswerten möchten, können Sie

./test 3 2 '*' 

In diesem Fall tun, um Ihr Programm erhält 3 getrennt zusätzliche Argumente so ist argv[1]3, argv[2]2 und argv[3] ist *

Oder könnten Sie tun:

./test '3 2 *' 

In diesem Fall erhält Ihr Programm 1 zusätzliches Argument, argv[1] ist die Zeichenfolge 3 2 *

+0

@Bathsheba, genau! – Bin

+0

Bedeutet, dass ich '*' als *, -_- – Bin

+3

analysieren muss Nein, Sie müssen ''*'' nicht als '*' analysieren. Es ist die Shell, die '*' in eine Liste von Dateien im aktuellen Verzeichnis und '* '' (oder '" * "') in nur '*' ändert. Wenn Sie also Ihr Programm '* '' von der Shell geben, würde Ihr Programm nur ein Argument enthalten, das '*' ohne Anführungszeichen enthält. – Shahbaz

8

Ihre Befehlsshell behandelt * als Wildcard. Es enthält wahrscheinlich jede Datei im aktuellen Verzeichnis: 60ish in Ihrem Fall.