Paramètre principal C

9

J'ai écrit un code qui doit afficher les paramètres principaux, mais quand je l'ai compilé et tapé dans le programme "*" montre ma structure de fichier. La commande en cmd ressemble à ceci: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;
}

Le résultat est:

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

Et ma question: est-il possible de forcer le programme à imprimer "*" au lieu de lister les fichiers. Merci en conseil

stasio14
la source
5
Le *obtient interprété par le shell, pas le programme lui-même. Utilisez \*ou "*"pour passer le * au programme.
mch
5
Le problème est qu'il *est converti "file1 file2 ..."par votre shell. Il n'y a rien de mal avec votre programme C (bien que l'inclusion <stdlib.h>ne soit pas nécessaire). Pour empêcher le shell de convertir l' étoile, utilisez des guillemets:program.exe 1 2 3 "*"
pmg
merci pour l'aide
stasio14
Pas lié à la question, mais à proprement parler, char const* argv[]n'est pas correct. Vous ne pouvez pas inventer vous-même des formes de main (), seul le compilateur peut le faire. argvest en fait de la mémoire de lecture / écriture, même si y écrire n'est souvent pas la meilleure idée.
Lundin
1
Le shell cmd de Windows n'effectue pas d'extension générique. Soit il n'est pas exécuté à partir du shell cmd, soit le compilateur insère une logique pour émuler l'expansion que le shell ferait
ikegami

Réponses:

5

mingw oblige le programme à effectuer une expansion générique des paramètres. Ajoutez ce qui suit à votre programme pour désactiver ce comportement:

int _CRT_glob = 0;

Dans le monde unix, le shell devrait effectuer une expansion générique.

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

Dans le monde Windows, l'expansion des caractères génériques est laissée à l'application.

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

Cela rend difficile l'écriture de programmes portables. Étant donné que mingw est souvent utilisé pour compiler des programmes qui n'ont pas été écrits avec Windows à l'esprit, sa bibliothèque d'exécution C effectue automatiquement une expansion générique des paramètres.

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

Mais, mingw fournit une sortie. L'ajout de ce qui suit à votre programme désactive ce comportement:

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
la source