C parámetro principal

9

Escribí un código que tiene que mostrar los parámetros principales, pero cuando lo compilé y escribí "*", el programa muestra la estructura de mi archivo. El comando en cmd se ve así: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;
}

El resultado es:

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

Y mi pregunta: ¿es posible forzar al programa a imprimir "*" en lugar de listar archivos. Gracias en consejos

stasio14
fuente
55
El *intérprete lo interpreta, no el programa en sí. Use \*o "*"para pasar el * al programa.
mch
55
El problema es que su shell lo *convierte "file1 file2 ...". No hay nada malo con su programa C (aunque incluirlo <stdlib.h>no es necesario). Para evitar que el shell convierta la estrella, use comillas:program.exe 1 2 3 "*"
pmg
gracias por la ayuda
stasio14
No relacionado con la pregunta, pero estrictamente hablando, char const* argv[]no es correcto. No puede inventar formas de main () por sí mismo, solo el compilador puede hacerlo. argven realidad es memoria de lectura / escritura, a pesar de que escribir a menudo no es la mejor idea.
Lundin
1
El shell de cmd de Windows no realiza la expansión de comodines. O no se ejecuta desde el shell de cmd, o el compilador está insertando lógica para emular la expansión que haría el shell
ikegami

Respuestas:

5

mingw hace que el programa realice una expansión comodín de los parámetros. Agregue lo siguiente a su programa para deshabilitar este comportamiento:

int _CRT_glob = 0;

En el mundo de Unix, se espera que el shell realice una expansión comodín.

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

En el mundo de Windows, la expansión de comodines se deja a la aplicación.

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

Eso hace que escribir programas portátiles sea complicado. Dado que mingw a menudo se usa para compilar programas que no se escribieron teniendo en cuenta Windows, su biblioteca de tiempo de ejecución C realiza la expansión comodín de los parámetros automáticamente.

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

Pero, mingw proporciona una salida. Agregar lo siguiente a su programa deshabilita este comportamiento:

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
fuente