C parametro principale


9

Ho scritto un codice che deve visualizzare i parametri principali, ma quando l'ho compilato e digitato il programma "*" mostra la mia struttura di file. Il comando in cmd è simile al seguente: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;
}

Il risultato è:

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

E la mia domanda: è possibile forzare il programma a stampare "*" invece di elencare i file. Grazie in consiglio


5
Il *ottiene interpretato dalla shell, non il programma stesso. Utilizzare \*o "*"per passare * al programma.
MCH

5
Il problema è che *viene convertito "file1 file2 ..."dalla shell. Non c'è niente di sbagliato nel tuo programma C (anche se l'inclusione <stdlib.h>non è necessaria). Per impedire alla shell di convertire la stella usare le virgolette:program.exe 1 2 3 "*"
pmg

grazie per l'aiuto
stasio14

Non correlato alla domanda, ma a rigor di termini, char const* argv[]non è corretto. Non puoi inventare forme di main () da solo, solo il compilatore può farlo. argvè in realtà memoria di lettura / scrittura, anche se scrivere su di essa spesso non è la migliore idea.
Lundin

1
La shell cmd di Windows non esegue l'espansione jolly. O non viene eseguito dalla shell cmd, oppure il compilatore sta inserendo la logica per emulare l'espansione che la shell farebbe
ikegami

Risposte:


5

mingw fa sì che il programma esegua l'espansione jolly dei parametri. Aggiungi quanto segue al tuo programma per disabilitare questo comportamento:

int _CRT_glob = 0;

Nel mondo unix, la shell dovrebbe eseguire l'espansione jolly.

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

Nel mondo Windows, l'espansione jolly è lasciata all'applicazione.

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

Ciò rende difficile scrivere programmi portatili. Poiché mingw viene spesso utilizzato per compilare programmi che non sono stati scritti pensando a Windows, la sua libreria di runtime C esegue automaticamente l'espansione jolly dei parametri.

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

Ma, mingw fornisce un'uscita. L'aggiunta di quanto segue al programma disattiva questo comportamento:

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
*
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.