C основной параметр

9

Я написал код, который должен отображать основные параметры, но когда я скомпилировал его и набрал "*", программа показывает структуру моего файла. Команда в cmd выглядит так: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;
}

Результат:

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

И мой вопрос: можно ли заставить программу печатать "*" вместо перечисления файлов. Спасибо за совет

stasio14
источник
5
*Получает интерпретатором, а не сама программа. Используйте \*или "*"для передачи * в программу.
MCH
5
Проблема в том, что *конвертируется в "file1 file2 ..."вашу оболочку. В вашей C-программе нет ничего плохого (хотя в <stdlib.h>этом нет необходимости). Чтобы предотвратить преобразование звезды в оболочку, используйте кавычки:program.exe 1 2 3 "*"
pmg
спасибо за помощь
stasio14
Не относится к вопросу, но, строго говоря, char const* argv[]это не правильно. Вы не можете сами придумывать формы main (), это может делать только компилятор. argvфактически является памятью для чтения / записи, хотя запись в нее часто не самая лучшая идея.
Лундин
1
Командная оболочка Windows не выполняет подстановочные знаки. Либо он не запускается из оболочки cmd, либо компилятор вставляет логику для эмуляции расширения, которое будет выполнять оболочка
ikegami

Ответы:

5

Mingw заставляет программу выполнять подстановку параметров подстановочными знаками. Добавьте следующее в вашу программу, чтобы отключить это поведение:

int _CRT_glob = 0;

Ожидается, что в мире Unix оболочка будет выполнять расширение по шаблону.

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

В мире Windows расширение подстановочных знаков оставлено на усмотрение приложения.

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

Это делает написание портативных программ сложным. Поскольку mingw часто используется для компиляции программ, которые не были написаны для Windows, его библиотека времени выполнения C выполняет автоматическое раскрытие параметров с помощью подстановочных знаков.

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

Но Mingw обеспечивает выход. Добавление следующего к вашей программе отключает это поведение:

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
источник