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

І моє запитання: чи можна змусити програму друкувати "*" замість переліку файлів. Дякую за пораду


5
*Отримує інтерпретатором, а не як така програма. Використовуйте \*або "*"для передачі * до програми.
мч

5
Проблема в тому, що *перетворюється на "file1 file2 ..."вашу оболонку. У вашій програмі C нічого поганого (хоча в тому числі <stdlib.h>не потрібно). Щоб перешкодити оболонці перетворити зірку, використовуйте цитати:program.exe 1 2 3 "*"
pmg

дякую за допомогу
stasio14

Не стосується питання, але строго кажучи, char const* argv[]невірно. Ви не можете вигадувати форми main () самостійно, це може зробити лише компілятор. argvнасправді пам'ять для читання / запису, навіть якщо писати до неї часто не найкраща ідея.
Лундін

1
Оболонка cmd 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
*
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.