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
การ*ตีความของเชลล์ไม่ใช่โปรแกรมเอง ใช้\*หรือ"*"เพื่อส่ง * ไปยังโปรแกรม
mch

5
ปัญหาคือเปลือกของคุณ*แปลงเป็น ไม่มีอะไรผิดปกติกับโปรแกรม C ของคุณ (รวมถึงไม่จำเป็นต้องใช้) เพื่อป้องกันไม่ให้เชลล์แปลงเครื่องหมายดาวใช้:"file1 file2 ..."<stdlib.h>program.exe 1 2 3 "*"
pmg

ขอบคุณสำหรับความช่วยเหลือ
stasio14

ไม่เกี่ยวข้องกับคำถาม แต่พูดอย่างเคร่งครัดchar const* argv[]ไม่ถูกต้อง คุณไม่สามารถประดิษฐ์รูปแบบของ main () ได้ด้วยตัวเองเฉพาะผู้รวบรวมเท่านั้นที่สามารถทำได้ argvจริง ๆ แล้วเป็นหน่วยความจำแบบอ่าน / เขียนแม้ว่าการเขียนไปยังมักจะไม่ใช่ความคิดที่ดีที่สุด
Lundin

1
เชลล์ cmd ของ Windows ไม่ได้ทำการขยายสัญลักษณ์แทน ไม่ว่ามันจะไม่ถูกเรียกใช้จาก cmd shell หรือคอมไพเลอร์กำลังแทรกลอจิกเพื่อเลียนแบบการขยายตัวของเชลล์
ikegami

คำตอบ:


5

mingw ทำให้โปรแกรมดำเนินการขยายสัญลักษณ์ของพารามิเตอร์ เพิ่มสิ่งต่อไปนี้ในโปรแกรมของคุณเพื่อปิดการทำงานนี้:

int _CRT_glob = 0;

ในโลกยูนิกซ์เชลล์คาดว่าจะทำการขยายตัวสัญลักษณ์แทน

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

ในโลก Windows การขยายไวด์การ์ดจะถูกทิ้งไว้ที่แอปพลิเคชัน

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

ทำให้การเขียนโปรแกรมพกพายุ่งยาก เนื่องจาก mingw มักถูกใช้เพื่อคอมไพล์โปรแกรมที่ไม่ได้เขียนด้วย Windows ในใจ, C runtime library ของมันจะทำการขยาย wildcard ของพารามิเตอร์โดยอัตโนมัติ

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
*
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.