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 ..."गया है। आपके सी प्रोग्राम में कुछ भी गलत नहीं है (हालांकि <stdlib.h>आवश्यक नहीं है)। स्टार उपयोग उद्धरण बदलने के लिए शेल को रोकने के लिए :program.exe 1 2 3 "*"
pmg

मदद के लिए धन्यवाद
stasio14

प्रश्न से संबंधित नहीं है, लेकिन सख्ती से बोलना char const* argv[]सही नहीं है। आप अपने द्वारा मुख्य () के रूपों का आविष्कार नहीं कर सकते, केवल कंपाइलर ही ऐसा कर सकते हैं। argvस्मृति वास्तव में पढ़ने / लिखने के लिए है, भले ही यह अक्सर सबसे अच्छा विचार नहीं है।
लुंडिन

1
Windows cmd शेल वाइल्डकार्ड विस्तार नहीं करता है। या तो इसे cmd शेल से नहीं चलाया जा रहा है, या कंपाइलर तर्क का विस्तार करने के लिए तर्क
डाल रहा है

जवाबों:


5

mingw कार्यक्रम को मापदंडों के वाइल्डकार्ड विस्तार करने का कारण बनता है। इस व्यवहार को अक्षम करने के लिए अपने प्रोग्राम में निम्नलिखित जोड़ें:

int _CRT_glob = 0;

यूनिक्स दुनिया में, शेल में वाइल्डकार्ड विस्तार करने की उम्मीद है।

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

विंडोज दुनिया में, वाइल्डकार्ड विस्तार को एप्लिकेशन पर छोड़ दिया जाता है।

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

यह पोर्टेबल प्रोग्राम को मुश्किल बनाता है। चूंकि मिंगव को अक्सर उन कार्यक्रमों को संकलित करने के लिए उपयोग किया जाता है जो विंडोज के साथ नहीं लिखे गए थे, इसकी सी रनटाइम लाइब्रेरी स्वचालित रूप से मापदंडों का वाइल्डकार्ड विस्तार करती है।

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

लेकिन, मिंगव एक आउट प्रदान करता है। अपने प्रोग्राम में निम्न जोड़ना इस व्यवहार को अक्षम करता है:

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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.