Parâmetro principal C

9

Eu escrevi um código que precisa exibir os parâmetros principais, mas quando o compilei e digitei "*" o programa mostra minha estrutura de arquivos. O comando no cmd se parece com o seguinte: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;
}

O resultado é:

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

E minha pergunta: é possível forçar o programa a imprimir "*" em vez de listar arquivos. Obrigado no conselho

stasio14
fonte
5
O *é interpretado pelo shell, não pelo próprio programa. Use \*ou "*"para passar o * para o programa.
mch 31/03
5
O problema é que ele *é convertido "file1 file2 ..."pelo seu shell. Não há nada errado com o seu programa C (embora a inclusão <stdlib.h>não seja necessária). Para impedir que o shell converta a estrela, use aspas:program.exe 1 2 3 "*"
pmg
Obrigado pela ajuda
stasio14
Não relacionado à questão, mas estritamente falando, char const* argv[]não está correto. Você não pode inventar formas de main () sozinho, apenas o compilador pode fazer isso. argvé, na verdade, memória de leitura / gravação, mesmo que a gravação não seja a melhor idéia.
Lundin
11
O shell cmd do Windows não executa expansão de curinga. Ou ele não está sendo executado a partir do shell do cmd ou o compilador está inserindo uma lógica para emular a expansão que o shell faria
ikegami

Respostas:

5

mingw faz com que o programa execute expansão curinga dos parâmetros. Adicione o seguinte ao seu programa para desativar esse comportamento:

int _CRT_glob = 0;

No mundo unix, espera-se que o shell execute expansão de curinga.

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

No mundo do Windows, a expansão de curinga é deixada para o aplicativo.

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

Isso torna complicado escrever programas portáteis. Como o mingw é frequentemente usado para compilar programas que não foram escritos com o Windows em mente, sua biblioteca de tempo de execução C executa automaticamente a expansão de caracteres curinga dos parâmetros.

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

Mas, mingw fornece uma saída. Adicionar o seguinte ao seu programa desabilita esse 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
*
ikegami
fonte