Parameter utama C

9

Saya menulis kode yang harus menampilkan parameter utama, tetapi ketika saya mengkompilasinya dan mengetikkan "*" program menunjukkan struktur file saya. Perintah dalam cmd terlihat seperti ini: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;
}

Hasilnya adalah:

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

Dan pertanyaan saya: Apakah mungkin memaksa program untuk mencetak "*" alih-alih daftar file. Terima kasih atas sarannya

stasio14
sumber
5
Yang *ditafsirkan oleh shell, bukan program itu sendiri. Gunakan \*atau "*"untuk meneruskan * ke program.
mch
5
Masalahnya adalah bahwa *dikonversi "file1 file2 ..."oleh shell Anda. Tidak ada yang salah dengan program C Anda (meskipun termasuk <stdlib.h>tidak perlu). Untuk mencegah shell mengonversi tanda bintang gunakan tanda kutip:program.exe 1 2 3 "*"
pmg
terima kasih atas bantuan
stasio14
Tidak terkait dengan pertanyaan, tetapi secara tegas, char const* argv[]tidak benar. Anda tidak dapat menemukan bentuk main () sendiri, hanya kompiler yang dapat melakukannya. argvsebenarnya membaca / menulis memori, meskipun menulis itu sering bukan ide terbaik.
Lundin
1
Windows cmd shell tidak melakukan ekspansi wildcard. Entah itu tidak dijalankan dari shell cmd, atau kompiler sedang memasukkan logika untuk meniru ekspansi yang akan dilakukan shell
ikegami

Jawaban:

5

mingw menyebabkan program melakukan ekspansi wildcard dari parameter. Tambahkan yang berikut ke program Anda untuk menonaktifkan perilaku ini:

int _CRT_glob = 0;

Di dunia unix, shell diharapkan melakukan ekspansi wildcard.

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

Di dunia Windows, ekspansi wildcard diserahkan ke aplikasi.

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

Itu membuat menulis program portabel rumit. Karena mingw sering digunakan untuk mengkompilasi program yang tidak ditulis dengan Windows dalam pikiran, pustaka runtime C melakukan ekspansi wildcard dari parameter secara otomatis.

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

Tapi, mingw memberikan jalan keluar. Menambahkan hal berikut ke program Anda menonaktifkan perilaku ini:

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
sumber