Główny parametr C.

9

Napisałem kod, który musi wyświetlać główne parametry, ale kiedy go skompilowałem i wpisałem „*” program pokazuje moją strukturę plików. Polecenie w cmd wygląda następująco: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;
}

Wynik to:

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

I moje pytanie: Czy można zmusić program do drukowania „*” zamiast wyświetlania plików na liście. Dziękuję za radę

stasio14
źródło
5
*Dostaje interpretowane przez powłokę, a nie sam program. Użyj \*lub, "*"aby przekazać * do programu.
mch
5
Problem polega na tym, że *jest konwertowany "file1 file2 ..."przez powłokę. Nie ma nic złego w twoim programie C (chociaż dołączenie <stdlib.h>nie jest konieczne). Aby zapobiec konwersji gwiazdy przez powłokę, użyj cudzysłowów:program.exe 1 2 3 "*"
pmg
dzięki za pomoc
stasio14
Nie związane z pytaniem, ale ściśle mówiąc, char const* argv[]nie jest poprawne. Nie możesz sam wymyślać form main (), może to zrobić tylko kompilator. argvto tak naprawdę pamięć do odczytu / zapisu, nawet jeśli zapisywanie w niej często nie jest najlepszym pomysłem.
Lundin
1
Powłoka cmd systemu Windows nie wykonuje interpretacji symboli zastępczych. Albo nie jest uruchamiany z powłoki cmd, albo kompilator wstawia logikę w celu naśladowania rozszerzenia, które zrobiłaby powłoka
ikegami

Odpowiedzi:

5

mingw powoduje, że program wykonuje rozszerzenie symboli wieloznacznych. Dodaj następujące elementy do swojego programu, aby wyłączyć to zachowanie:

int _CRT_glob = 0;

W świecie uniksowym oczekuje się, że powłoka wykona ekspansję symboli wieloznacznych.

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

W świecie Windows rozszerzenie symboli wieloznacznych jest pozostawione aplikacji.

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

To sprawia, że ​​pisanie programów przenośnych jest trudne. Ponieważ mingw jest często używany do kompilacji programów, które nie zostały napisane z myślą o systemie Windows, biblioteka środowiska wykonawczego C automatycznie rozszerza parametry za pomocą symboli wieloznacznych.

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

Ale mingw zapewnia wyjście. Dodanie do programu następujących elementów wyłącza to zachowanie:

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
źródło