C Hauptparameter

9

Ich habe einen Code geschrieben, der die Hauptparameter anzeigen muss, aber wenn ich ihn kompiliert und in das Programm "*" eingegeben habe, wird meine Dateistruktur angezeigt. Der Befehl in cmd sieht folgendermaßen aus:program.exe 1 2 3 *

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char const* argv[]) {
    for (int i=0; i<argc; i++) printf("%s\n", argv[i]);
    return 0;
}

Das Ergebnis ist:

program
1
2
3
program.c
program.exe
10-03-20
11-02-20

Und meine Frage: Ist es möglich, das Programm zu zwingen, "*" zu drucken, anstatt Dateien aufzulisten? Danke im Rat

stasio14
quelle
5
Das *wird von der Shell interpretiert, nicht vom Programm selbst. Verwenden Sie \*oder "*", um das * an das Programm zu übergeben.
mch
5
Das Problem ist, dass von Ihrer Shell *konvertiert "file1 file2 ..."wird. Es ist nichts falsch mit Ihrem C-Programm (obwohl das Einschließen <stdlib.h>nicht erforderlich ist). Um zu verhindern, dass die Shell den Stern konvertiert, verwenden Sie Anführungszeichen:program.exe 1 2 3 "*"
pmg
danke für
hilfe
Nicht mit der Frage verbunden, aber genau genommen char const* argv[]ist nicht richtig. Sie dürfen Formen von main () nicht selbst erfinden, das darf nur der Compiler. argvist eigentlich Lese- / Schreibspeicher, obwohl das Schreiben oft nicht die beste Idee ist.
Lundin
1
Die Windows-Cmd-Shell führt keine Platzhaltererweiterung durch. Entweder wird es nicht von der cmd-Shell ausgeführt, oder der Compiler
fügt eine

Antworten:

5

mingw veranlasst das Programm, eine Wildcard-Erweiterung der Parameter durchzuführen. Fügen Sie Ihrem Programm Folgendes hinzu, um dieses Verhalten zu deaktivieren:

int _CRT_glob = 0;

In der Unix-Welt wird erwartet, dass die Shell eine Wildcard-Erweiterung durchführt.

$ perl -le'print for @ARGV' *
a
b

In der Windows-Welt bleibt die Platzhaltererweiterung der Anwendung überlassen.

>perl -le"print for @ARGV" *
*

Das macht das Schreiben von tragbaren Programmen schwierig. Da mingw häufig zum Kompilieren von Programmen verwendet wird, die nicht für Windows geschrieben wurden, führt die C-Laufzeitbibliothek die Platzhaltererweiterung der Parameter automatisch durch.

a.c::

#include <stdio.h>

int main(int argc, char const* argv[]) {
    for (int i=0; i<argc; i++)
        printf("%s\n", argv[i]);

    return 0;
}
>gcc -Wall -Wextra -pedantic-errors a.c -o a.exe & a *
a
a.c
a.exe

Aber Mingw bietet ein Out. Wenn Sie Ihrem Programm Folgendes hinzufügen, wird dieses Verhalten deaktiviert:

int _CRT_glob = 0; 

a.c::

#include <stdio.h>

int _CRT_glob = 0; 

int main(int argc, char const* argv[]) {
    for (int i=0; i<argc; i++)
        printf("%s\n", argv[i]);

    return 0;
}
>gcc -Wall -Wextra -pedantic-errors a.c -o a.exe & a *
a
*
Ikegami
quelle